Dav*_*uer 8 merge r plyr dataframe data.table
a <- data.frame(id = 1:3, v1 = c('a', NA, NA), v2 = c(NA, 'b', 'c'))
b <- data.frame(id = 1:3, v1 = c(NA, 'B', 'C'), v2 = c("A", NA, NA))
> a
id v1 v2
1 1 a <NA>
2 2 <NA> b
3 3 <NA> c
> b
id v1 v2
1 1 <NA> A
2 2 B <NA>
3 3 C <NA>
Run Code Online (Sandbox Code Playgroud)
注意:两个表中都没有定义v1或v2的id; 每个id值在每列中只有一个唯一的非NA值
ab <- merge(a, b, by = "id")
Run Code Online (Sandbox Code Playgroud)
v1和v2,使data.frame ab看起来就像这样:ab <- data.frame(id = 1:3, v1 = c("a", "B", "C"), v2 = c("A", "b", "c"))
> ab
id v1 v2
1 1 a A
2 2 B b
3 3 C c
Run Code Online (Sandbox Code Playgroud)
> merge(a, b, by = "id")
id v1.x v2.x v1.y v2.y
1 1 a <NA> <NA> A
2 2 <NA> b B <NA>
3 3 <NA> c C <NA>
Run Code Online (Sandbox Code Playgroud)
data.frame和data.table,所以这里的上述data.table版本:A <- data.table(a, key = 'id')
B <- data.table(b, key = 'id')
A[B]
Run Code Online (Sandbox Code Playgroud)
您指定的合并类型可能无法使用merge(使用数据框),尽管说通常会被证明是错误的.
您还省略了一些细节:NA每个值的每列中是否总会有一个唯一的非id值?如果是这样,这将有效:
ab <- rbind(a,b)
> colFun <- function(x){x[which(!is.na(x))]}
> ddply(ab,.(id),function(x){colwise(colFun)(x)})
id v1 v2
1 1 a A
2 2 B b
3 3 C c
Run Code Online (Sandbox Code Playgroud)
类似的策略也应该与data.tables 一起使用:
abDT <- data.table(ab,key = "id")
> abDT[,list(colFun(v1),colFun(v2)),by = id]
id V1 V2
[1,] 1 a A
[2,] 2 B b
[3,] 3 C c
Run Code Online (Sandbox Code Playgroud)