【问题标题】:Calculate Grouped mean and populate in new column in R [duplicate]计算分组平均值并填充到R中的新列中[重复]
【发布时间】:2019-05-16 23:55:20
【问题描述】:

我需要一个按月份分组的新平均值列,并且每个月的相同平均值重复该月出现 n 次。

计算了分组平均值,但它们是唯一值,我无法让它在几个月内并排重复 n 次。

tn_1$GAVG = aggregate(tn_1$FATALITIES, list(tn_1$MONTH), mean)

它给出了以下错误

 Error in `$<-.data.frame`(`*tmp*`, GAVG, value = list(Group.1 = c("01",  : 
 replacement has 12 rows, data has 6267

新列必须显示每个月值的平均值。

 structure(list(FATALITIES = c(1L, 2L, 5L, 5L, 3L, 3L, 3L, 4L, 
8L, 1L, 7L, 4L, 3L, 4L, 12L, 4L, 1L, 2L, 3L, 1L, 0L, 0L, 4L, 
1L, 0L, 5L, 0L, 12L, 3L, 2L, 4L, 5L, 1L, 22L, 0L, 1L, 2L, 4L, 
7L, 3L), MONTH = c("04", "04", "04", "04", "05", "05", "05", 
"05", "05", "05", "05", "05", "05", "05", "06", "06", "06", "06", 
"06", "06", "06", "06", "06", "06", "06", "06", "06", "06", "06", 
"06", "06", "06", "06", "06", "06", "06", "06", "06", "06", "06"
)), .Names = c("FATALITIES", "MONTH"), row.names = c(NA, 40L), class = "data.frame")

【问题讨论】:

  • 同意上面的^,一个可重现的例子会很有帮助。您可以在数据框中使用 dput() 为您提供重现数据的代码。您的数据样本应该足够了
  • 我的解决方法是mg &lt;- aggregate(tn_1$FATALITIES, list(tn_1$MONTH), mean) names(mg) &lt;- c("MONTH", "GAVG") tn_1 &lt;- left_join(tn_1, mg, by = ("MONTH"))
  • 我需要一个班轮

标签: r calculated-columns


【解决方案1】:

使用dplyr

dat %>% group_by(MONTH) %>% mutate(avg=mean(FATALITIES))
# A tibble: 40 x 3
# Groups:   MONTH [3]
   FATALITIES MONTH   avg
        <int> <chr> <dbl>
 1          1 04     3.25
 2          2 04     3.25
 3          5 04     3.25
 4          5 04     3.25
 5          3 05     4.00
 6          3 05     4.00
 7          3 05     4.00
 8          4 05     4.00
 9          8 05     4.00
10          1 05     4.00
# ... with 30 more rows

或者,如果您只想使用基本 R:

dat$avg<- ave(dat$FATALITIES, dat$MONTH, FUN=mean)

后者大约快 10 倍:

microbenchmark(one=dat %>% group_by(MONTH) %>% mutate(avg=mean(FATALITIES)), two=ave(dat$FATALITIES, dat$MONTH, FUN=mean))
Unit: microseconds
 expr      min       lq      mean   median        uq      max neval
  one 3698.875 4018.193 4438.3810 4283.864 4650.8455 10019.83   100
  two  265.885  326.586  458.7712  476.840  530.2735   820.31   100

【讨论】:

  • 请注意,我添加了更快的 base-R 版本。
  • 如果是ave,则不需要FUN,默认为mean with(dat, ave(FATALITIES, MONTH))
  • 没错,但我还是喜欢这样写,这样代码对我来说更清晰。
【解决方案2】:

尝试使用基础 R ave

df$MEAN=ave(df$FATALITIES,df$MONTH,FUN=mean)

【讨论】:

    猜你喜欢
    • 2015-11-02
    • 2021-07-07
    • 1970-01-01
    • 2016-05-11
    • 2014-02-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-27
    相关资源
    最近更新 更多