[英]How to combine magrittr pipes and %in% inside a dplyr::filter predicate function?
給定輸入數據框
library(dplyr)
( df <- data_frame(id = c(1,1,1,2,2,3), y = letters[1:6]) )
# # A tibble: 6 × 2
# id y
# <dbl> <chr>
# 1 1 a
# 2 1 b
# 3 1 c
# 4 2 d
# 5 2 e
# 6 3 f
假設一個人只想獲得df[, c("id", "y")]
的子集,而該子集只有兩個最常見的ID,即id
1
和2
:
df %>% group_by(id) %>% tally %>% arrange(desc(n)) %>% head(2) %>% .$id %>% print -> ids #*
# [1] 1 2
問題:有沒有一種方法可以在filter
內部的謂詞函數中使用管道,該管道的以下方面:
df %>% filter(
id %in% df %>% group_by(id) %>% tally %>% arrange(desc(n)) %>% head(2) %>% .$id )
# Error: no applicable method for 'group_by_' applied to an object of class "logical"
df %>% filter(
id %in% (df %>% group_by(id) %>% tally %>% arrange(desc(n)) %>% head(2) %>% .$id) )
# Error: cannot handle
df %>% filter(
id %in% {df %>% group_by(id) %>% tally %>% arrange(desc(n)) %>% head(2) %>% .$id} )
# Error: cannot handle
?
我的意思是,最后兩個謂詞似乎在filter
之外按預期工作:
df$id %in% (df %>% group_by(id) %>% tally %>% arrange(desc(n)) %>% head(2) %>% .$id)
# [1] TRUE TRUE TRUE TRUE TRUE FALSE
df$id %in% {df %>% group_by(id) %>% tally %>% arrange(desc(n)) %>% head(2) %>% .$id}
# [1] TRUE TRUE TRUE TRUE TRUE FALSE
旁注:我知道我可以使用一個臨時變量ids
:
df %>% filter(id %in% ids) # *ids <- c(1,2)
或者我可以使用*_join
:
df %>% inner_join(
df %>% group_by(id) %>% tally %>% arrange(desc(n)) %>% head(2) %>% select(-n))
兩者都產生預期的輸出 :
# # A tibble: 5 × 2
# id y
# <dbl> <chr>
# 1 1 a
# 2 1 b
# 3 1 c
# 4 2 d
# 5 2 e
不要為了自己而使它變得復雜。
ids <- (df %>% count(id) %>% arrange(n) %>% tail(2))$id
filter(df, id %in% ids)
可以進行連續鏈接,但由於存在其他解決方案, dplyr
不會過多地粘在dplyr
/ filter
-仍與%>%
兼容:
df %>%
group_by(id) %>%
tally %>%
arrange(desc(n)) %>%
head(2) %>%
.$id %>%
is.element(df$id, .) %>%
subset(df, .)
Source: local data frame [5 x 2]
id y
(dbl) (chr)
1 1 a
2 1 b
3 1 c
4 2 d
5 2 e
當鏈變長時,將鏈鏈接起來然后包裹起來會很混亂。
對於這樣的重用,我寧願選擇一個R型底襯:
df[df$id %in% as.integer(names(tail(sort(table(df$id)),2))),]
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.