通过关键字合并数据框内的行

5
如果我有一个带键列和数据列的数据框,就像这样:

如果我有一个带键列和数据列的数据框,就像这样

df <- cbind(key=c("Jane", "Jane", "Sam", "Sam", "Mary"), var1=c("a", NA, "a", "a", "c"), var2=c(NA, "b", NA, "b", "d"))

key    var1 var2
"Jane" "a"  NA  
"Jane" NA   "b" 
"Sam"  "a"  NA
"Sam"  "a"  "b" 
"Mary" "c"  "d" 
"Mary" "c"  NA

我希望您能够创建一个数据框,通过姓名合并行,尽可能覆盖缺失值,如下所示:

key    var1 var2
"Jane" "a"  "b"
"Sam"  "a"  "b"
"Mary" "c"  "d"

我该如何做到这一点?

1
如果可能的话,您应该提供一个更好的例子来说明。因为在您目前的例子中,这总是可以实现的。 - flodel
2个回答

6
library(data.table)
dtt <- as.data.table(df)

dtt[, list(var1=unique(var1[!is.na(var1)])
         , var2=unique(var2[!is.na(var2)]))
    , by=key]

    key var1 var2
1: Jane    a    b
2: Mary    c    d
3:  Sam    a    b

2
太棒了!感谢您发现我示例中的错误 :( - sus

3

以下是使用dplyr的解决方案。请注意,cbind()生成矩阵而不是数据框,因此我修改了代码以实现您的预期目标。我还将选择算法提取到单独的函数中。我认为这是一个好习惯,因为它允许您在一个地方更改算法,如果您发现需要不同的功能。

df <- data.frame(
  key = c("Jane", "Jane", "Sam", "Sam", "Mary"), 
  var1 = c("a", NA, "a", "a", "c"), 
  var2 = c(NA, "b", NA, "b", "d"),
  stringsAsFactors = FALSE
)

library(dplyr)

collapse <- function(x) x[!is.na(x)][1]

df %.% 
  group_by(key) %.%
  summarise(var1 = collapse(var1), var2 = collapse(var2))
# Source: local data frame [3 x 3]
# 
#  key var1 var2
# 1 Mary    c    d
# 2  Sam    a    b
# 3 Jane    a    b

1
我曾试图使用plyr,但失败了。我将不得不查看dplyr文档以理解其工作原理,但还是谢谢! - sus
@sus 一个plyr的解决方案也很简单:ddply(df, "key", summarise, var1 = collapse(var1), var2 = collapse(var2) - hadley
如果我有20列需要合并,如何按ID和年份合并行? - ZayzayR

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接