[心得] dplyr filter and slice

看板R_Language作者 (讓你喜歡這世界~)時間9年前 (2015/12/31 17:28), 編輯推噓3(307)
留言10則, 3人參與, 最新討論串1/2 (看更多)
當你有一個 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 -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 140.109.73.102 ※ 文章網址: https://www.ptt.cc/bbs/R_Language/M.1451554100.A.516.html

12/31 18:11, , 1F
之前都用filter(row_number(col_a) == 1)
12/31 18:11, 1F

12/31 18:13, , 2F
那是不是要先排序?
12/31 18:13, 2F

12/31 18:55, , 3F
對!不過我之前都是倒序多,所以都用row_number(desc(col_
12/31 18:55, 3F

12/31 18:55, , 4F
a))== 1
12/31 18:55, 4F

12/31 22:14, , 5F
我覺得先排序很慢喔 可是我又不像C大這麼熱血測時間
12/31 22:14, 5F

12/31 22:18, , 6F
rank, which.min都要排序啊...
12/31 22:18, 6F

12/31 22:20, , 7F
印象中好像比 arrange + 抓第一筆來的快
12/31 22:20, 7F

12/31 22:36, , 8F
明天測試看看
12/31 22:36, 8F

01/01 21:46, , 9F
我覺得memphis的應該會比較快,which.min應該不用真的排序
01/01 21:46, 9F

01/01 21:47, , 10F
只需要掃過一次就好,但是arrange就一定要排了 :P
01/01 21:47, 10F
文章代碼(AID): #1MXFKqKM (R_Language)
討論串 (同標題文章)
文章代碼(AID): #1MXFKqKM (R_Language)