r语言 - 是否有一种方法可以根据该组内的行从标签中过滤出整个组?



如果我有一个标签,其中每一行代表一些对象和多个组件共享和对象的组件,是否有一种方法来分析所有给定的对象组件和删除其相应的行,如果它不匹配一些条件?

例如,假设我想清理

下面的表格
tib <- tibble(object = c("a", "a", "a", "a", "b", "b", "b"),
component = c("x", "x", "y", "z", "x", "y", "y"),
data = 1:7)

我知道一个对象只能包含一个组件"x"因此,对象"无效,因为它有两个。所以这四行都对应于对象"需要移除

我知道filter()函数可以在整个组上工作,但我正在努力寻找一种方法来分析过滤器函数中的组。我想我最接近的是下面,但它根本不起作用。也许我完全错了。

tib %>%
group_by("object") %>%
filter(count(cur_data(), component)$b != 1)

我们可以检查每组的条件sum(component == "x") < 2:

library(dplyr)
tib %>% 
group_by(object) %>% 
filter(sum(component == "x") < 2)
#> # A tibble: 3 x 3
#> # Groups:   object [1]
#>   object component  data
#>   <chr>  <chr>     <int>
#> 1 b      x             5
#> 2 b      y             6
#> 3 b      z             7

或者,我们可以使用unlist(table(component))["x]"来查看component == "x"在每组中出现的频率。然后我们可以过滤那些符合== 1条件的组。当我们想要检查多个变量是否出现时,这种方法更加灵活。

library(dplyr)
tib %>% 
group_by(object) %>% 
filter(unlist(table(component))["x"] == 1L) 
#> # A tibble: 3 x 3
#> # Groups:   object [1]
#>   object component  data
#>   <chr>  <chr>     <int>
#> 1 b      x             5
#> 2 b      y             6
#> 3 b      z             7

由reprex包(v2.0.1)在2022-11-10创建

最新更新