2012-01-17 18 views
1

多くのdata.framesをマージする必要があります。エラーを再現するコードのサンプルの下。それはバグのようです。data.framesをマージするとmatch.namesエラーが発生する

このコードはうまく機能:

df1 <- data.frame(v=1:10, v2=rev(1:10)) 
df2 <- data.frame(vv=1:8, v2=rev(5:12)) 
df12 <- merge(x=df1, y=df2, by.x=1, by.y=1, all=TRUE, suffixes=c(".x", ".y")) 
df3 <- data.frame(w=2:6, v2=3:7) 
df123 <- merge(x=df12, y=df3, by.x=1, by.y=1, all=TRUE, suffixes=c(".x", ".y")) 
df4 <- data.frame(x=1:6, v2=1:6) 
df1234 <- merge(x=df123, y=df4, by.x=1, by.y=1, all=TRUE, suffixes=c(".x", ".y")) 

このコードの最後の行にエラーメッセージを生成:match.namesでエラーが発生しました(clabs、名前(XI)):名前は、以前の名前と一致しません。唯一の変化はnrow(DF4)> nrow(df123)

df1 <- data.frame(v=1:10, v2=rev(1:10)) 
df2 <- data.frame(vv=1:8, v2=rev(5:12)) 
df12 <- merge(x=df1, y=df2, by.x=1, by.y=1, all=TRUE, suffixes=c(".x", ".y")) 
df3 <- data.frame(w=2:6, v2=3:7) 
df123 <- merge(x=df12, y=df3, by.x=1, by.y=1, all=TRUE, suffixes=c(".x", ".y")) 
df4 <- data.frame(x=1:16, v2=1:16) 
df1234 <- merge(x=df123, y=df4, by.x=1, by.y=1, all=TRUE, suffixes=c(".x", ".y")) 

はその後、任意の1

names(df123)[4] <- "v3" 

上の最後の名前を変更するのは、df123

names(df123) 
[1] "v" "v2.x" "v2.y" "v2" 

の列の名前を見てみましょうということですそして今このコード行は正しく動作します

df1234 <- merge(x=df123, y=df4, by.x=1, by.y=1, all=TRUE, suffixes=c(".x", ".y")) 

これはバグですか?私はWin7でR 2.13.1を使用しました。 その他の情報が必要な場合は、質問に追加します。

+0

これは本当のバグのようです。これは、おそらくRのlistservに送信する必要があります。最初にmerge.data.frameの関連する行を探してみるべきです。 – nograpes

+1

私はR 2.14.1と同じ動作をします。私はまた、エラーが 'nrow(df4)'が 'nrow(df123)'より大きくなることを確認できます。 'df4 < - data.frame(x = 1:10、v2 = 1:10)'で 'df4 < - data.frame(x = 1:11、v2 = 1:11)'とすると、報告されたエラー。私は、問題が、動作するときに、 '名前(df1234)'が '' [1] v''''''''''''''' v2.y''''' v2.x'''''''''を '' '' v2.y''に与えると想像します。正常に構築されたデータフレームでは発生してはならない重複した列名があります。このエラーは、 'backndrace()'からわかるように、 'ribnd(x、ya)'からスローされています。 –

+0

ご清聴ありがとうございます! – DrDom

答えて

4

これは間違いなくバグです。私はWindows 7のR 2.14.1でそれをテストしましたが、オペレーティングシステムの問題は疑問です。私はここにバグの「小さい」テストケースを再作成:

# Create data. 
df1=data.frame(rbind(c(1,10,12,NA))) 
df2=data.frame(rbind(c(11,11))) 

# Works fine. 
merge(df1,df2,by=1,all=T) 

# X1 X2.x X3 X4 X2.y 
# 1 1 10 12 NA NA 
# 2 11 NA NA NA 11 

# Change the names of the columns. 
names(df1)= c('v','v2.x','v2.y','v2') 
names(df2)= c('x','v2') 

# Same data fails! 
merge(df1,df2,by=1,all=T) 

# Error in match.names(clabs, names(xi)) : 
# names do not match previous names 

エラーがこの行に、「merge.data.frame」方式で行われます。

x <- rbind(x, ya) 

問題は "ということです「x」と「ya」は同じ列名を共有しません。その問題は、わずか2行前の前に、この行で発生します

ya <- cbind(ya, x[rep.int(NA_integer_, nyy), nm.x, drop = FALSE]) 

「nm.xは、」名前cのセット(「バージョン2.x」、「v2.y」、 "バージョン2.xであります")。 xは名前が 'v2.x'の2つの列を持つdata.frameです。興味深いことに、このdata.frameから列を選択すると、列の名前が変更されたように見えます!

names(x) 
[1] "v" "v2.x" "v2.y" "v2.x" 
nm.x 
[1] "v2.x" "v2.y" "v2.x" 
x[,nm.x] 
    v2.x v2.y v2.x.1 
1 10 12  10 

は私ではなく名前で、列の位置を使用することによってこの問題を解決しようとしましたが、結果の名前がまだ変更された(ただし、値は、あなたが望むものを今しています)!

x[,c(2,3,4)] 
    v v2.x v2.y v2.x.1 
1 1 10 12 NA 

私はposted this as a bugです。

+0

私はRで比較的初心者であり、迅速にそのような調査を行うことができなかったので、あなたにバグレポートをありがとう。私の最初の問題を解決するために、各マージ後の列名を番号などで置き換え、最後のdata.frameで別のベクトルに格納された正しい名前に置き換えます(はい、重複した名前が必要です)。 – DrDom

+0

ここでループをクローズするには、Rニュースファイルの2012-01-24エントリに、「merge()は重複した列名を持つデータフレームを作成できなくなりました(PR#14786と混同しています)。 PR#14786は、このディスカッションから得たバグレポートであるhttps://bugs.r-project.org/bugzilla3/show_bug.cgi?id=14786を指します。 –

関連する問題