2016-06-27 3 views
3

У меня есть следующий кадр данных: колоноккак фильтровать верхние 10 процентиля столбца в кадре данных группы по идентификатору с помощью dplyr

id total_transfered_amount day 
1  1000     2 
1  2000     3 
1  3000     4 
1  1000     1 
1  10000    4 
2  5000     3 
2  6000     4 
2  40000    2 
2  4000     3 
2  4000     3 
3  1000     1 
3  2000     2 
3  3000     3 
3  30000    3 
3  3000     3 

необходим отфильтровать из строк, которые попадают выше 90 процентиля в «total_transfered_amount» для каждого ID отдельно, используя dplyr пакет preferabely, например, мне нужно отфильтровать следующие строки:

2  40000    2 
3  30000    3 
+0

@akrun оценить вашу идею – sanaz

+0

@DatamineR оцените вашу помощь – sanaz

+0

@ Mateusz1981 i сомневаюсь sample_frac работы, основанные на концепции процентиля, не хотят пробовать столбцы, я хочу сохранить 90 процентилей и избавиться от строк, которые подделываются в топ-10 процентах – sanaz

ответ

1

Мы можем использовать data.table

library(data.table) 
setDT(df1)[,.SD[quantile(total_transfered_amount, 0.9) < 
       total_transfered_amount] , by = id] 
# id total_transfered_amount day 
#1: 1     10000 4 
#2: 2     40000 2 
#3: 3     30000 3 

Или мы можем использовать base R

df1[with(df1, as.logical(ave(total_transfered_amount, id, 
       FUN=function(x) quantile(x, 0.9) < x))),] 
# id total_transfered_amount day 
#5 1     10000 4 
#8 2     40000 2 
#14 3     30000 3 
+0

да правильно, что, если мы хотим сохранить его в качестве фрейма данных и использовать dplyr? – sanaz

+0

@sanaz 'data.table' должен работать с' dplyr'. Если вам нужно изменить на 'data.frame, используйте' setDF (res) ' – akrun

+0

, проблема в том, что я могу перенести код в r-искра, тогда нет никакой концепции data.table в R spark yet – sanaz

0

Checkt это. Я не понимаю, почему у вас есть первая строка в вашем выводе

dane <- data.frame(id = c(1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 3, 3, 3, 3,3), total_trans = c(1000, 2000, 3000, 1000, 10000, 5000, 6000, 
                          40000, 4000, 4000, 1000, 2000, 3000, 30000, 3000), 
         day = c(2, 3,4, 1, 4, 3, 4, 2, 3, 3, 1, 2, 3, 3, 3)) 

    library(dplyr) 




dane %>% group_by(id) %>% filter(quantile(total_trans, 0.9)<total_trans) 





     id total_trans day 
    (dbl)  (dbl) (dbl) 
1  1  10000  4 
2  2  40000  2 
3  3  30000  3 
+0

Отредактировано, я только догадался, что 10000 может упасть выше 90 процентов, – sanaz

+0

, что ваш ответ отсутствует, я думаю, что он вычисляет процентиль для целого столбца, но нам нужно сделать это отдельно для каждой группы идентификаторов. – sanaz

+0

ok, просто добавьте 'Group_by (factor (id))' Before 'mutate' – Mateusz1981