簡體   English   中英

如何在dplyr :: filter謂詞函數中合並magrittr管道和%in%?

[英]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 12

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM