使用dplyr截断数值变量的顶部和底部百分位数

7

我生成了一份调查权重。由于异常值的调查权重可能导致非常大的差异,我遵循许多统计书籍的建议:我想削减调查权重中的前5%和后5%。我想使用dplyr来实现这一点。

#generate data
data<-as.data.frame(cbind(sequence(2000),rnorm(2000,mean=3.16,sd=1.355686))) 
names(data)<-c("id","weight")

#This is how far i got
data2<-data %>% mutate(perc.weight=percent_rank(weight)) %>%
                mutate(perc.weight>0.95 | perc.weight<0.05)

在此之后,我获得了两个新变量。第一个变量给出权重的百分比排名。第二个变量显示值是否超出了目标范围。
现在,我想用那些百分位数边界所组成的权重值来替换处于95-100百分位和0-5百分位内的权重。
如果能得到任何帮助,我将不胜感激!
1个回答

13
你可以使用 quantile 函数与 pminpmax 一起使用:
data %>% mutate(weight_trunc = pmin(pmax(weight, quantile(weight, .05)), 
                                          quantile(weight, .95)))

如果我可以提出后续问题:如果我想将重量分成10个10%的百分位数,然后使用每个百分位数的平均值作为权重,我该如何做? - SEMson
@user2982730,如果你还不知道的话,你可能想要查看dplyr的ntile函数。@shadow,好答案!(+1) - talat
1
我忘记了,这是我在评论中第二个问题的解决方案:weight <- weight%>% 通过mutate(perc.weight = percent_rank(weight))%>%进行变异 group_by(percentile = ntile(perc.weight,10)) weight <- weight.strata%>%mutate(percentile_mean = mean(weight)) - SEMson

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接