R转换数据帧并删除NA

时间:2015-03-31 16:46:30

标签: r transform na

我已将R中的数据集从LONG格式转换为WIDE格式,现在每行都有一个测量值。什么是基于"日期"来整合行的最佳方法。列并删除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

任何建议或帮助将不胜感激!

3 个答案:

答案 0 :(得分:3)

如果每行有一个测量值:

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")

答案 1 :(得分:3)

如果不了解有关数据集的更多信息,可以尝试以下方法:

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”(但这将是您最快的选项之一),但可以是您最喜欢的聚合函数之一。

答案 2 :(得分:2)

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

如果每个“日期”每列只有一次非NA观察,您可以将summarise_each步骤替换为summarise_each(funs(na.omit(.)))