连接data.frame或data.table中的匹配列

Dav*_*uer 8 merge r plyr dataframe data.table

我有以下data.frames:

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值

我想在"id"的匹配值上合并这些数据框:

ab <- merge(a, b, by = "id")
Run Code Online (Sandbox Code Playgroud)

但我也想在两列合并v1v2,使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.framedata.table,所以这里的上述data.table版本:

A <- data.table(a, key = 'id')
B <- data.table(b, key = 'id')
A[B]
Run Code Online (Sandbox Code Playgroud)

jor*_*ran 7

您指定的合并类型可能无法使用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)