我每天都有多个观察数据,我想构建一个每日平均值表。我的本能方法(来自其他编程语言)是按日期对数据进行排序,并编写一个for循环来完成并将其平均化。但每当我看到一个涉及for循环的R问题时,往往会有一个强烈的响应,R处理矢量类型的方法要好得多。对这个问题更聪明的做法是什么?
作为参考,我的数据类似于
date observation
2017-4-4 17
2017-4-4 412
2017-4-4 9
2017-4-3 96
2017-4-3 14
2017-4-2 8
我希望输出成为一个看起来像
的新数据框date average
2017-4-4 146
2017-4-3 55
2017-4-2 8
答案 0 :(得分:2)
require("dplyr")
df <- data.frame(date = c('2017-4-4', '2017-4-4', '2017-4-4', '2017-4-3', '2017-4-3', '2017-4-2'),
observation = c(17, 412, 8, 96, 14, 8))
df %>%
group_by(date) %>%
summarise(average = mean(observation)) %>%
data.frame
答案 1 :(得分:1)
tapply()
可以做到这一点:
df <- read.table(header=TRUE, text=
'date observation
2017-4-4 17
2017-4-4 412
2017-4-4 9
2017-4-3 96
2017-4-3 14
2017-4-2 8')
df$date <- as.Date(df$date, format="%Y-%m-%d")
m <- tapply(df$observation, df$date, FUN=mean)
d.result <- data.frame(date=as.Date(names(m), format="%Y-%m-%d"), m)
# > d.result
# date m
# 2017-04-02 2017-04-02 8
# 2017-04-03 2017-04-03 55
# 2017-04-04 2017-04-04 146
或
aggregate(observation ~ date, data=df, FUN=mean)
或data.table
library("data.table")
dt <- fread(
'date observation
2017-4-4 17
2017-4-4 412
2017-4-4 9
2017-4-3 96
2017-4-3 14
2017-4-2 8')
dt[ , .(observation = mean(observation)), by=date]