2013-06-18 3 views
2

У меня есть функция, как это:Как применить функцию для каждого уровня факторной переменной?

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 
... ... 

Я уже судимым, tapply, sapply, но все это изменяет структуру вывода набора данных.

ответ

5

Посмотрите ? 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 
+0

К сожалению, я не использовал верхний корпус FUN. Благодаря! – kostia

Смежные вопросы