dplyr:基于不同列中第一次出现的范围的平均值

dplyr:基于不同列中第一次出现的范围的平均值,r,dplyr,mutate,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 我希望在这

我想使用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(我不在乎四舍五入)

我们可以这样做

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
df%>%group\u by(x)%>%mutate(ave={
如果(有(z>=90)){
idxU=90)

idxL但是
17560
不是在第一个z>=90之前的第一次z>=31吗?朱利叶斯·瓦诺拉:条件大于或等于31,不大于。是的。但是如果我们从
16090
开始,首先满足条件的是
17560
。如果我们从顶部开始,它就是
19031
。那么为什么要跳过呢
17560
(假设我们需要上升)?啊,明白了。我犯了一个错误,=31,而不是>=31。将修复。谢谢。这会在数据集中发生多次吗(对于给定的
x
)?例如,z=31的两个实例,…,90?谢谢,这是一个好的开始,但是是的,当没有31或90+@Travis,啊,好的,不确定这是否可能时,会出现大量错误。将很快更新答案。因此,1)没有31和没有90+意味着到处都是0,2)31存在,但没有90+意味着什么?从某个地方开始,一直到最后?与31类似对于90+。数据是过期天数(拖欠帐户)。对于您的分数:1)正确。2)存在31,90+不存在,则为0。3)如果90存在,则31肯定存在。@Travis,请参阅更新。如果90+存在,则代码相同,否则为0。
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