dplyr:根据不同列中的首次出现情况在一个范围内求平均值

时间:2019-01-20 22:52:51

标签: r dplyr mutate

我想使用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

1 个答案:

答案 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按要求的平均值。