作者memphis (让你喜欢这世界~)
看板R_Language
标题[心得] dplyr filter and slice
时间Thu Dec 31 17:28:17 2015
当你有一个 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://webptt.com/cn.aspx?n=bbs/R_Language/M.1451554100.A.516.html
1F:推 k75715: 之前都用filter(row_number(col_a) == 1) 12/31 18:11
2F:→ memphis: 那是不是要先排序? 12/31 18:13
3F:推 k75715: 对!不过我之前都是倒序多,所以都用row_number(desc(col_ 12/31 18:55
4F:→ k75715: a))== 1 12/31 18:55
5F:→ memphis: 我觉得先排序很慢喔 可是我又不像C大这麽热血测时间 12/31 22:14
6F:→ celestialgod: rank, which.min都要排序啊... 12/31 22:18
7F:→ memphis: 印象中好像比 arrange + 抓第一笔来的快 12/31 22:20
8F:→ celestialgod: 明天测试看看 12/31 22:36
9F:推 k75715: 我觉得memphis的应该会比较快,which.min应该不用真的排序 01/01 21:46
10F:→ k75715: 只需要扫过一次就好,但是arrange就一定要排了 :P 01/01 21:47