簡體   English   中英

基於多列的分組過濾器

[英]Grouped filter based on multiple columns

我有一個包含 71 個組、每組 4 個觀察值和 18 個變量的數據框。 如果該組中的任何觀察值在 4 個不同變量中的任何一個中都小於特定值,我想刪除整個組,所有這些變量的名稱中都包含相同的字符串。 這是一個簡化版本:

df <- data.frame(group=letters[c(1, 1, 1, 2, 2, 2, 3, 3, 3)], 
                 var.one=c(111, 100, 98, 93, 99, 101, 100, 99, 97),
                 var.two=c(102, 96, 99, 100, 101, 102, 99, 90, 101),
                 other=c(seq(1:9)))

我想保留包含“var”的所有變量都大於 95 的任何組的所有成員,並刪除任何包含“var”的變量小於 95 的任何組的所有成員。這應該讓我只剩下組A:

group var.one var.two other
1     a     111     102     1
2     a     100      96     2
3     a      98      99     3

我可以像這樣輕松過濾與這些條件匹配的單個行:

df %>% filter_at(vars(contains('var')), all_vars(. >=95))

但這當然不會刪除與之關聯的整個組。 我還可以輕松排除與單個變量不匹配的整個組:

df %>% group_by(group) %>% filter(!any(var.one <95))

但當然,這只適用於單個變量,而不適用於多個變量。

我如何結合這兩種方法?

使用最新版本的dplyr ,您可以

df %>% 
   group_by(group) %>% 
   filter(across(contains('var'), ~all(.>95)))

cross across() function 基本上是后續版本中filter_atall_vars的替代品。 有關 function 的更多信息,請參閱?across幫助頁面。

您可以使用if_all

library(dplyr)

df %>%
  group_by(group) %>%
  filter(if_all(starts_with('var'), ~all(.x > 95))) %>%
  ungroup

#  group var.one var.two other
#  <chr>   <dbl>   <dbl> <int>
#1 a         111     102     1
#2 a         100      96     2
#3 a          98      99     3

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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