我想使用dyplr和mutate创建一个新变量,该变量可以为0或y列中的平均值,并以z列为范围。
对于列z范围,我想将z> = 90的第一时间用作该范围的最大值,然后将紧接在z> = 90之前的第一时间z = 31用于该范围的最小值。
注意:我将按x列分组
例如:
x y z
1 100 0
1 90 0
1 90 31
1 90 60
1 80 31
1 75 60
1 60 90
1 60 60
2 60 0
2 60 30
我将在此范围内平均y:
x y z
1 80 31
1 75 60
1 60 90
所以我最终得到的值是71.7(我不在乎四舍五入)。
x y z ave
1 100 0 0
1 90 0 0
1 90 31 0
1 90 60 0
1 80 31 71.7
1 75 60 71.7
1 60 90 71.7
1 60 60 0
2 60 0 0
2 60 30 0
答案 0 :(得分:1)
我们可能会
df %>% group_by(x) %>% mutate(ave = {
if(any(z >= 90)) {
idxU <- which.max(z >= 90)
idxL <- max(which(z[1:idxU] == 31))
replace(z * 0, idxL:idxU, mean(z[idxL:idxU]))
} else {
0
}
})
# x y z ave
# 1 1 100 0 0.00000
# 2 1 90 0 0.00000
# 3 1 90 31 0.00000
# 4 1 90 60 0.00000
# 5 1 80 31 60.33333
# 6 1 75 60 60.33333
# 7 1 60 90 60.33333
# 8 1 60 60 0.00000
# 9 2 60 0 0.00000
# 10 2 60 30 0.00000
因此,idxU
是范围的上限,idxL
是范围的下限,然后在最后一行替换零向量idxL:idxU
的元素z * 0
按要求的平均值。