【问题标题】:Subset a dataframe, calculate the mean and populate a dataframe in a loop in R对数据框进行子集化,计算平均值并在 R 中的循环中填充数据框
【发布时间】:2018-08-06 10:43:43
【问题描述】:

我有一组来自两个变量的 85 种可能组合,一个有五个值(年份),一个有 17 个值(位置)。我制作了一个数据框,第一列中包含年份,第二列中包含位置。对于年份和位置的每个组合,我想计算加权平均值,然后根据年份和位置值将其添加到第三列。

我的代码如下:

for (i in unique(data1$year)) {
  for (j in unique(data1$location)) {
   data2 <- crossing(data1$year, data1$location)
   dataname <- subset(data1, year %in% i & location %in% j)
   result <- weighted.mean(dataname$length, dataname$raising_factor, na.rm = T)

  } 
}

我得到的结果将最后计算的平均值放在每一行的第三列中。

我怎样才能让它根据匹配的年份和位置组合添加?

谢谢。

【问题讨论】:

  • 请填写您的question reproducible。添加预期输出并添加 data1 data.frame 的子集。
  • 检查dplyr::group_bymutate

标签: r loops mean


【解决方案1】:

base R 选项将是 by

by(df[c('x', 'y')], df[c('group', 'year')],
          function(x) weighted.mean(x[,1], x[,2]))

基于@LAP的例子

【讨论】:

    【解决方案2】:

    正如@A.Suleiman 建议的那样,我们可以使用dplyr::group_by

    示例数据:

    df <- data.frame(group = rep(letters[1:5], each = 4),
                     year = rep(2001:2002, 10),
                     x = 1:20,
                     y = rep(c(0.3, 1, 1/0.3, 0.4), each = 5))
    
    library(dplyr)
    
    df %>%
      group_by(group, year) %>%
      summarise(test = weighted.mean(x, y))
    
    # A tibble: 10 x 3
    # Groups:   group [?]
        group  year      test
       <fctr> <int>     <dbl>
     1      a  2001  2.000000
     2      a  2002  3.000000
     3      b  2001  6.538462
     4      b  2002  7.000000
     5      c  2001 10.538462
     6      c  2002 11.538462
     7      d  2001 14.000000
     8      d  2002 14.214286
     9      e  2001 18.000000
    10      e  2002 19.000000
    

    【讨论】:

      猜你喜欢
      • 2018-06-21
      • 2020-05-24
      • 2019-07-11
      • 2021-12-04
      • 2012-11-06
      • 2018-01-05
      • 2020-12-16
      • 1970-01-01
      • 2016-02-03
      相关资源
      最近更新 更多