我有这样的功能:
remove_outliers<-function(x){
qnt<- quantile(x,probs=0.99)
y<- x
y[x>qnt]<- NA
y}
目的是删除位于数据顶部1%的异常值(用NA替换它们的值)。如何在因子变量的各个级别上应用此功能?
例如,
A组和B组的原始数据集:
group share
A 100
A 50
A 30
A 10
... ...
B 100
B 90
B 80
B 60
... ...
应该这样结束:
group share
A NA
A 50
A 30
A 10
... ...
B NA
B 90
B 80
B 60
... ...
我已经试过了,但是这些都改变了数据集输出的结构。
答案 0 :(得分:6)
看看? ave
,它完全符合您的要求:
remove_outliers<-function(x){
qnt<- quantile( x,probs=0.99 )
x[ x>qnt ]<- NA
return(x)
}
# assuming your data.frame is called mdf
mdf$fixed <- ave( mdf$share, mdf$group, FUN = remove_outliers )
mdf
group share fixed
1 A 100 NA
2 A 50 50
3 A 30 30
4 A 10 10
5 B 100 NA
6 B 90 90
7 B 80 80
8 B 60 60