[英]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_at
和all_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.