我有以下数据框:
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>
注意:在这两个表中,不存在v1或v2都已定义的id;每个id值的每列只有一个唯一的非NA值。
我想要根据"id"的匹配值合并这些数据框:
ab <- merge(a, b, by = "id")
但我也想将两列v1
和v2
组合起来,这样数据框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
相反,我得到了这个:
> 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>
使用data.frame
和data.table
的示例将非常有帮助,因此以下是上面的data.table
版本:
A <- data.table(a, key = 'id')
B <- data.table(b, key = 'id')
A[B]
colFun
应用于每一列,而不需要明确列出它们。 - joranDT[,lapply(.SD,colFun),by=id]
。 - Matt Dowlelapply(colnames(abDT), colFun)
但是留下了无名列;.SD
真是太棒了!而且速度非常快。 - David LeBauer