按列中的子组计算

时间:2017-12-07 05:17:23

标签: r tidyverse

我的数据集大致如下:

> dataSet
   month detrend
1    Jan  315.71
2    Jan  317.45
3    Jan   317.5
4    Jan   317.1
5    Jan  315.71
6    Feb  317.45
7    Feb   313.5
8    Feb   317.1
9    Feb  314.37
10   Feb  315.41
11 March  316.44
12 March  315.73
13 March  318.73
14 March  315.55
15 March  312.64
.
.
.

如何按月计算平均值 ?例如,我想要像

这样的东西
> by_month
   month ave_detrend
1    Jan  315.71
2    Feb  317.45
3  March   317.5

2 个答案:

答案 0 :(得分:1)

您需要关注的是按月对您感兴趣的列(“detrend”)进行分组的方法。在“vanilla R”中有很多方法可以做到这一点,但最有效的方法是使用tidyverse的{​​{3}}。

我将使用直接从该页面获取的示例:

mtcars %>%
  group_by(cyl) %>%
  summarise(disp = mean(disp), sd = sd(disp))

在你的情况下,那将是:

by_month <- dataSet %>%
  group_by(month) %>%
  summarize(avg = mean(detrend))

这个新的“tidyverse”风格看起来很不一样,你看起来很新,所以我会解释发生了什么(对不起,如果这个过于明显):

  1. 首先,我们正在抓取数据框,我正在调用dataSet
  2. 然后我们管道该数据集到我们的下一个函数,即group_by。管道意味着我们将最后一个命令的结果(在这种情况下只是数据帧dataSet)并将其用作下一个函数的第一个参数。函数group_by提供了一个数据框作为其第一个函数。
  3. 然后,该群组的结果将通过管道传输到下一个功能,即summarize(或summarise,如果您来自下方,则作者是)。 summarize只需使用列中的所有数据进行计算,然而,group_by函数会在该列中创建分区。所以我们现在计算出我们制作的每个分区的平均值,即月份。
    • 这是关键:group_by创建“标记”,以便summarize分别计算每个组的函数(在本例中为mean)。因此,例如,所有Jan值都组合在一起,然后仅mean计算它们。然后,对于所有Feb值,计算平均值等。
  4. HTH !!

答案 1 :(得分:0)

R具有内置的均值函数:mean(x, trim = 0, na.rm = FALSE, ...)

我会做这样的事情:

january <- dataset[dataset[, "month"] == "january",]
januaryVector <- january[, "detrend"]
januaryAVG <- mean(januaryVector)