跨行平均的最佳方法

时间:2017-04-04 10:25:37

标签: r

我每天都有多个观察数据,我想构建一个每日平均值表。我的本能方法(来自其他编程语言)是按日期对数据进行排序,并编写一个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

2 个答案:

答案 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]