如果我有一个标签,其中每一行代表一些对象和多个组件共享和对象的组件,是否有一种方法来分析所有给定的对象组件和删除其相应的行,如果它不匹配一些条件?
例如,假设我想清理
下面的表格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创建