R 转换数据框并删除 NA

R Transform Data Frame and Remove NAs

我已经将 R 中的数据集从 LONG 格式转换为 WIDE 格式,现在每行有一个测量值。合并基于 "Date" 列的行并删除 NA 的最佳方法是什么?

这是我所拥有的示例:

    Date    M1  M2  M3  M4
1   2013    NA  NA  NA  2
2   2013    6   NA  NA  NA
3   2013    NA  19  NA  NA
4   2013    NA  NA  10  NA
5   2014    NA  NA  NA  1
6   2014    NA  NA  231 NA
7   2014    NA  215 NA  NA
8   2014    16  NA  NA  NA

这就是我想要创建的:

    Date    M1  M2  M3  M4
1   2013    6   19  10  2
2   2014    16  215 231 1

如有任何建议或帮助,我们将不胜感激!

如果每行有一个测量值:

result<-aggregate(cbind(M1=data$M1, M2=data$M2, M3=data$M3, M4=data$M4), 
                  by=list(Date= data$Date), FUN=sum, na.rm=TRUE) 

编辑 正如 Ananda 在评论中提到的那样更好:

 aggregate(. ~ Date, mydf, sum, na.rm = TRUE, na.action = "na.pass")

在不了解你的数据集的情况下,你可以尝试这样的事情:

library(data.table)
as.data.table(mydf)[, lapply(.SD, sum, na.rm = TRUE), by = Date]
#    Date M1  M2  M3 M4
# 1: 2013  6  19  10  2
# 2: 2014 16 215 231  1

它不一定要使用 "data.table"(但这将是您最快的选择之一),但可以是您最喜欢的聚合函数之一。

使用dplyr

library(dplyr)
df1%>% 
   group_by(Date) %>%
   summarise_each(funs(sum(., na.rm=TRUE)))
#  Date M1  M2  M3 M4
#1 2013  6  19  10  2
#2 2014 16 215 231  1

如果每个 'Date' 的每一列只有一个非 NA 观察,您可以将 summarise_each 步骤替换为 summarise_each(funs(na.omit(.)))