[心得] dplyr filter and slice

作者: memphis (讓你喜歡這世界~)   2015-12-31 17:28:17
當你有一個 data.frame (如下)
ID col_a col_b
01 01 2
01 02 1
02 05 3
02 NA 4
03 NA 2
03 NA 3
ID=c('01','01','02','02','03','03')
col_a <- c('01','02','05',NA,NA,NA)
col_b <- c(2,1,3,4,2,3)
m <- data.frame(ID, col_a, col_b, stringsAsFactors=F)
####
1. 想要挑每組 col_a 最小
m %>% group_by(ID) %>% summarize(min_a = min(col_a, na.rm=T))
ID min_a
(chr) (chr)
1 01 01
2 02 05
3 03 NA
Warning message:
In min(c(NA_character_, NA_character_), na.rm = TRUE) :
no non-missing arguments, returning NA
####
2. 想要挑每組 col_a 最小時的 col_b
m %>% group_by(ID) %>% filter(col_a = min(col_a))
Error: filter condition does not evaluate to a logical vector.
m %>% group_by(ID) %>% filter(rank(col_a, ties.method='first')==1)
ID col_a col_b
(chr) (chr) (dbl)
1 01 01 2
2 02 05 3
3 03 NA 2
####
3. 想要挑每組 col_a 最小時的 col_b (較快)
m %>% group_by(ID) %>% slice(which.min(col_a))
ID col_a col_b
(chr) (chr) (dbl)
1 01 01 2
2 02 05 3
####
歡迎討論各種例外狀況
有些時候取大取小, 只接受數字, 有時候又可以自己轉換
有些時候文字可以比大小, 其中有些格子是空格會無法比, 要轉成NA
作者: k75715 (風可以這麼大的嗎)   2014-01-01 21:46:00
我覺得memphis的應該會比較快,which.min應該不用真的排序只需要掃過一次就好,但是arrange就一定要排了 :P
作者: k75715 (風可以這麼大的嗎)   2015-12-31 18:11:00
之前都用filter(row_number(col_a) == 1)
作者: memphis (讓你喜歡這世界~)   2015-12-31 18:13:00
那是不是要先排序?
作者: k75715 (風可以這麼大的嗎)   2015-12-31 18:55:00
對!不過我之前都是倒序多,所以都用row_number(desc(col_a))== 1
作者: memphis (讓你喜歡這世界~)   2015-12-31 22:14:00
我覺得先排序很慢喔 可是我又不像C大這麼熱血測時間
作者: celestialgod (天)   2015-12-31 22:18:00
rank, which.min都要排序啊...
作者: memphis (讓你喜歡這世界~)   2015-12-31 22:20:00
印象中好像比 arrange + 抓第一筆來的快
作者: celestialgod (天)   2015-12-31 22:36:00
明天測試看看

Links booklink

Contact Us: admin [ a t ] ucptt.com