我有来自两个变量的一组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)
}
}
我得到的结果将最后计算的均值放在每一行的第三列中。
如何根据匹配的年份和位置组合进行添加?
谢谢。
答案 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