【问题标题】:Best method for averaging across rows [duplicate]跨行平均的最佳方法[重复]
【发布时间】:2017-04-04 19:32:25
【问题描述】:

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

【问题讨论】:

  • 感谢您的帮助!不过,这个问题实际上与我的完全不同。它要求同一行中多个变量的平均值。为了澄清起见,我想对可能多行的单个变量进行平均。因此,输出将是一个新的数据框,其中包含日期列表和每个日期的观察平均值。
  • tapply(df$observation, df$date, FUN=mean) stackoverflow.com/questions/3505701/…
  • 在发布此类问题之前请“搜索和研究”,并展示您迄今为止所做的尝试。这将为您提供更多帮助。
  • @jogo 您链接的问题中的回答非常有启发性,我可以看到该方法每天输出,然后是平均值。您的链接将此称为“参差不齐”的数组,我无法找到一种干净的方法来单独提取日期或平均值(例如,绘制它们)。

标签: r


【解决方案1】:
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

【讨论】:

    【解决方案2】:

    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]
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-09-12
      • 2021-09-14
      • 2016-08-12
      • 1970-01-01
      • 2013-04-28
      • 1970-01-01
      相关资源
      最近更新 更多