2017-04-04 97 views
-2

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

感谢您的帮助!但这个问题其实和我的很不一样。它要求同一行中的多个变量的平均值。为了澄清,我想在可能的多行上平均一个变量。因此,输出将是一个新的数据框,其中包含日期列表和每个日期的观测值的平均值。 – muahdeb

+0

'tapply(df $ observation,df $ date,FUN = mean)'http://stackoverflow.com/questions/3505701/r-grouping-functions-sapply-vs-lapply-vs-apply-vs-tapply-vs -by-vs-aggrega – jogo

+0

在发布这样的问题之前,请先“搜索并研究”,然后展示您迄今尝试的内容。这会得到更多的帮助。 – micstr

回答

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