我已将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
任何建议或帮助将不胜感激!
答案 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(.)))