在不同列中压缩具有NA的行以创建单个行

Ant*_*nto 1 r plyr dataframe

我有这样的数据框

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))
Run Code Online (Sandbox Code Playgroud)

我得到了这个数据帧,并希望将其转换为每个唯一的'id'只有一行,而数据帧中没有NA.

我这样做

ddply(test, 
    .variables = 'id', 
    .fun = function(df){
        colSums(df[,1:4], na.rm = T)})
Run Code Online (Sandbox Code Playgroud)

获取此data.frame

      id  a  b  c  d
    1  A  1  2  3  4
    2  B 10 20 30 40
Run Code Online (Sandbox Code Playgroud)

它有效,但是有一种更直接的方法可以不使用colSums,压缩行来为每个'id'创建一行,因为在每个'id'中,所有列只有一个值,其余的是NAs .我确实遇到了类似的请求,同时寻找其他东西,但现在找不到它!

谢谢

Jil*_*ina 5

使用R基函数

> test[is.na(test)] <-0
> aggregate(.~id, data=test, FUN="sum")
  id  a  b  c  d
1  A  1  2  3  4
2  B 10 20 30 40
Run Code Online (Sandbox Code Playgroud)