【问题标题】:R -Finding Mean with multiple subsetsR - 寻找具有多个子集的均值
【发布时间】:2018-07-19 18:54:07
【问题描述】:

我有一个包含 4 列的数据集,如下所示。我想创建一个第 5 列(平均值),它具有基于前 3 列的第 4 列的平均值。

例如:Id (5000) 在日期 (1/1/2018) 的第一个小时 (hour=1) 的值的平均值是前 3 行 (2+2+1) 的平均值/3 = 1.67

>

head(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 和 Date 和 Hour 使用 for 循环。但最终在某些行中出现了 NA。请让我知道实现这一目标的有效方法。

【问题讨论】:

标签: r dataframe mean


【解决方案1】:

我会推荐使用dplyr 包。

library(dplyr)

read_df %>% 
    group_by(ID, Date) %>%          # Specifly your by-variables
    mutate(Mean = mean(Value)) %>%  # Calculate the mean
    ungroup()

【讨论】:

  • 酷!这行得通。但是,“平均值”是否会“绑定”到 read_df?你能告诉我我该怎么做吗?
  • @veggiecrunchburger mutate 是一个向 data.frame 添加新变量的函数。详情可参考http://dplyr.tidyverse.org/reference/mutate.html
  • 浏览了共享的链接,并阅读了有关 dplyr 的更多信息。但我正面临这个问题。我收到以下消息,平均值可用作最后一列和 [3 个其他变量:'X ,Y ,平均值 ']。但是当我尝试查看整个 df (read_df) 时,我看不到 Mean 列。请问有什么帮助或建议吗?
  • @veggiecrunchburger 这是因为您还没有将平均列保存在read_df 中。为此,您只需在 read_df %>% ... 之前添加 read_df <-
  • 在我的数据集中克服了几次小问题和其他问题后,我终于用上面的确切代码完成了这个每小时平均值。非常感谢!
【解决方案2】:

plyr 中的ddplyany 函数执行此操作。

plyr::ddply(read_df, c("Id", "Date", "Hour"), numcolwise(mean))

虽然在您的示例中我注意到第 3 行的日期不同,因此与您的示例相矛盾。

有一些更简单的函数可以做类似的事情,例如aggregate,但我喜欢ddply,因为它是一个很好的多面手。

【讨论】:

  • 对不起。那是一个错字。目标是根据日期和 ID 计算每小时平均值。我希望上面的代码有效。我会尽快试用。
  • ddply 的第二个参数中包含您要分组的所有变量。因此,如果那是 IdDateHour,请将这三个保留在那里。如果只是IdDate 取出Hour :)
  • 编辑您的问题以修正错字可能也值得。
  • 按照建议编辑了问题:)
  • 您能否告诉我为什么您在上面提供的“ddply”函数中没有“值”作为参数。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-06-12
  • 2018-05-21
  • 1970-01-01
  • 2020-08-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多