2016-06-27 58 views
3

來篩選由ID的數據幀組的列的頂端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包優選,例如我需要篩選出以下行:

2  40000    2 
3  30000    3 
+0

@akrun感謝您的想法 – sanaz

+0

@DatamineR感謝您的幫助 – sanaz

+0

@ Mateusz1981我懷疑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 spark然後R spark中沒有data.table概念 – sanaz

0

檢查了這一點。我不明白你爲什麼第一行中的輸出

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

你的答案缺失我認爲它是計算整列的百分位數,但我們需要爲每個ID組分別進行。 – sanaz

+0

好的,只需要添加'Group_by(factor(id))''mutate' – Mateusz1981