我有一个像这样的数据框
test <- data.frame(id = rep(LETTERS[1:2],each = 3), 
    a = c(1,NA,NA,10,NA,NA), 
    b = c(2,NA,NA,20,NA,NA), 
    c = c(NA,3,NA,NA,30,NA), 
    d = c(NA,NA,4,NA,NA,40))我得到了这个数据帧,并希望将其转换为每个唯一的'id‘只有一行,并且在数据帧中没有NAs。
我正在做这个
ddply(test, 
    .variables = 'id', 
    .fun = function(df){
        colSums(df[,1:4], na.rm = T)})获取此data.frame的步骤
      id  a  b  c  d
    1  A  1  2  3  4
    2  B 10 20 30 40它是有效的,但有没有一种更直接的方法来完成它而不使用colSums,某种程度上压缩行,为每个'id‘创建单行,因为在每个'id’中,所有列只有一个值,其余的都是NAs。我确实在寻找其他东西的时候遇到了类似的请求,但现在找不到了!
谢谢
发布于 2013-07-19 00:20:59
下面是我遇到类似问题时推荐给我的一个解决方案,使用data.table和is.na:
require(data.table)
DT=data.table(test)
unique(DT[, lapply(.SD, function(x) x[!is.na(x)]), by = id])
   id  a  b  c  d
1:  A  1  2  3  4
2:  B 10 20 30 40请注意,这将为您提供一个data.table,而不是一个data.frame。如果你不习惯使用这个数据结构,你可以很容易地转换它:
data.frame(unique(DT[, lapply(.SD, function(x) x[!is.na(x)]), by = id]))
  id  a  b  c  d
1  A  1  2  3  4
2  B 10 20 30 40https://stackoverflow.com/questions/17728540
复制相似问题