子集数据框,计算平均值,然后在R中的循环中填充数据框

时间:2018-08-06 10:43:44

标签: r loops mean

我有来自两个变量的一组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)

  } 
}

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

如何根据匹配的年份和位置组合进行添加?

谢谢。

2 个答案:

答案 0 :(得分:2)

base R选项为by

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

基于@LAP的示例

答案 1 :(得分:1)

按照@ 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