dplyr:基于不同列中第一次出现的范围的平均值
我想使用dyplr和mutate来创建一个新变量,它要么是0,要么是y列中值的平均值,以z列的范围为条件 对于z列范围,我想使用第一时间z>=90表示范围的最大值,然后使用z>=90之前的第一时间z=31表示范围的最小值 注意:我将按x列进行分组 例如: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 我希望在这
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