但我也想将两列
同时使用
我有以下数据帧:
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]
您指定的合并类型可能无法使用merge
(带有数据帧),尽管这通常会导致邀请被证明是错误的。
您还省略了一些细节:对于每个id
值,每列中是否总是有一个唯一的非NA
值?如果是这样,这将起作用:
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
类似的策略也应该适用于data.table
:
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
如果你的数据像上面一样简单,那么joran的答案可能是最简单的方法。以下是基地的可能方法:
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))
decider <- function(x, y) factor(ifelse(is.na(x), as.character(y), as.character(x)))
data.frame(mapply(a, b, FUN = decider))
如果你的数据有不同的id(有些重叠,有些没有,那么这里有一种不同的方法:
a <- data.frame(id = c(1,2,4,5), v1 = c('a', NA, "q", NA), v2 = c(NA, 'b', 'c', "e"))
b <- data.frame(id = 1:4, v1 = c(NA, "A", "C", 'B'), v2 = c("A", NA, "D", NA))
decider <- function(x, y) factor(ifelse(is.na(x), as.character(y), as.character(x)))
DF <- data.frame(mapply(a, b, FUN = decider))
DF2 <- rbind(b[!b$id %in% DF$id , ], DF)
DF2 <- DF2[order(DF2$id), ]
rownames(DF2) <- 1:nrow(DF2)