我有一个包含4列的数据集,如下所示。我想创建第5列(平均值),它具有基于前3列的第4列的平均值。
例如:Id(5000)日期(1/1/2018)的第一个小时(小时= 1)的值的平均值是前3行(2 + 2 + 1)的平均值/ 3 = 1.67
>
头(read_df [,1:5])
`
Id Date Hour Value Mean
5000 1/1/2018 1 1 1.67
5000 1/1/2018 1 2 1.67
5000 1/1/2018 1 2 1.67
5100 1/1/2018 4 2 2
5100 2/1/2018 6 2 3
5100 2/1/2018 6 4 3
5100 3/1/2018 2 7 7
5200 3/1/2018 3 3 4.5
5200 3/1/2018 3 6 4.5
我尝试为Id和日期和小时使用for循环。但最终在某些行中使用了NA。请告诉我一个实现这一目标的有效方法。
答案 0 :(得分:3)
我建议使用dplyr
包。
library(dplyr)
read_df %>%
group_by(ID, Date) %>% # Specifly your by-variables
mutate(Mean = mean(Value)) %>% # Calculate the mean
ungroup()
答案 1 :(得分:1)
ddply
的 plyr
对任何函数执行此操作。
plyr::ddply(read_df, c("Id", "Date", "Hour"), numcolwise(mean))
虽然在你的例子中我注意到第3行有不同的日期,所以这与你的例子相矛盾。
有更简单的功能可以做类似的事情,例如aggregate
,但我喜欢ddply
,因为它是一个很好的全能者。