rbindは、ベクトルを結合するときに列名をチェックしません。
l = list(row1 = c(10, 20), row2 = c(20, 10))
names(l$row1) = c("A", "B")
names(l$row2) = c("B", "A")
l
$row1
A B
10 20
$row2
B A
20 10
rbind(l$row1, l$row2)
A B
[1,] 10 20
[2,] 20 10
多数のリスト要素からこのマトリックスを作成し、列名が行全体で正しく一致するようにするにはどうすればよいですか?
A B
[1,] 10 20
[2,] 10 20
match
を使用できます:
l <- list(row1 = setNames(1:3, c("A", "B", "C")),
row2 = setNames(1:3, c("B", "C", "A")),
row3 = setNames(1:3, c("C", "A", "B")))
do.call(rbind, lapply(l, function(x) x[match(names(l[[1]]), names(x))]))
結果:
A B C
row1 1 2 3
row2 3 1 2
row3 2 3 1
smartbind()
は列名と一致し、欠落しているものを許容します。
library(gtools)
do.call(smartbind,l)
A B
row1 10 20
row2 10 20
Rの現在のバージョン(バージョン3.3.0があります)では、rbind
は、順序が異なっていても同じ名前の列を持つ2つのデータセットを結合する能力を持っているようです。
df1 <- data.frame(a = c(1:5), c = c(LETTERS[1:5]),b=c(11:15))
df2 <- data.frame(a = c(6:10), b = c(16:20),c=c(LETTERS[6:10]))
rbind(df1,df2)
a c b
1 1 A 11
2 2 B 12
3 3 C 13
4 4 D 14
5 5 E 15
6 6 F 16
7 7 G 17
8 8 H 18
9 9 I 19
10 10 J 20
最初にlの各要素をデータフレームに変更すると、rbind
が機能します。
do.call("rbind", lapply(l, function(x) data.frame(as.list(x))))
A B
row1 10 20
row2 10 20
do.call(rbind, lapply(l, function(row) row[order(names(row))]))
Reduceは強力な機能ですが、使用頻度が低いものもあります。ここに別の実装があります
これにより、「NA」に一致しない列が生成された場合に、rbindが作成されます。
rbindedFrame = Reduce(custom_rbind,listofDataframes)
custom_rbind = function(x1,x2){
c1 = setdiff(colnames(x1),colnames(x2))
c2 = setdiff(colnames(x2),colnames(x1))
for(c in c2){##Adding missing columns from 2 in 1
x1[[c]]=NA
}
for(c in c1){##Similiarly ading missing from 1 in 2
x2[[c]]=NA
}
x2 = x2[colnames(x1)]
rbind(x1,x2)
}
}
なぜrbind(l$row1, l$row2[names(l$row1)])
だけではありません。データフレームにも適しています。これは、l$row2
に含まれないl$row1
の列を破棄することに注意してください。