通过键合并数据帧中的行

时间:2014-01-30 01:59:01

标签: r dataframe

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

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

想要一个按名称合并行的数据帧,尽可能覆盖NAs,如此

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

我该怎么做?

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:2)

这是使用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