r - 在 R 中过滤组(子集)内的内容
问题描述
我有这个数据。
group name
1 A
1 A
1 A
1 B
1 C
2 A
2 B
3 A
3 B
3 C
3 D
我想用标准过滤组。例如,我想过滤 {A, B, C} 中的组。
组 1 将被过滤,因为 {A, B, C}(组 1 的唯一组合)在 {A, B, C} 中。
组 2 将被过滤,因为 {A, B} 在 {A, B, C}
但是,组 3 不会被过滤,因为 {A, B, C, D} 不是 {A, B, C} 的子集。
我应该如何处理这个问题?此外,我有更多的标准(即 {A, B, C} 和 {A, C} ...)。
structure(list(group = c(1, 1, 1, 1, 1, 2, 2, 3, 3, 3, 3),
name = c("A", "A", "A", "B", "C", "A", "B", "A", "B", "C", "D")),
row.names= c(NA, -11L), class = c("tbl_df", "tbl", "data.frame"))
解决方案
我们可以指定标准向量并做一个group_by
filter
stdvec <- c("A", "B", "C")
library(dplyr)
df1 %>%
group_by(group) %>%
filter(all(unique(name) %in% stdvec))
及其相反
df1 %>%
group_by(group) %>%
filter(!all(unique(name) %in% stdvec))
如果有更多的向量,它可能是
stdvec1 <- c("A", "B", "C")
stdvec2 <- c("A", "C")
df1 %>%
group_by(group) %>%
filter(all(stdvec2 %in% name) & all(stdvec1 %in% name))
及其相反
df1 %>%
group_by(group) %>%
filter(!(all(stdvec2 %in% name) & all(stdvec1 %in% name)))
或者它可能是union
多个向量中的一个,与unique
'name' 的值相比,并检查是否all
包含(和 negate !
)
df1 %>%
group_by(group) %>%
filter(!all(unique(name) %in% union(stdvec1, stdvec2)))
和
df1 %>%
group_by(group) %>%
filter(all(unique(name) %in% union(stdvec1, stdvec2)))
如果有很多vectors
,请使用reduce
tounion
library(purrr)
nm1 <- mget(ls(pattern = "^stdvec\\d+$")) %>%
reduce(union)
df1 %>%
group_by(group) %>%
filter(all(unique(name) %in% nm1))
推荐阅读
- elasticsearch - 将 Elasticsearch 数据保留限制在磁盘空间以下
- javascript - Gmail api - 浏览器快速入门错误:错误请求
- laravel - Laravel Passport 未使用 JWT cookie 进行身份验证(自用 API)
- javascript - aws s3 sdk 是否具有与 aws s3 cp 相同或等效的命令?
- laravel - Laravel 主键不允许为空
- excel - 用于对多列求和的最佳公式从搜索值返回 1 行
- python - 在 python 中使用 concat 运算符创建列表的复杂性
- python - 使用 Python 的 RabbitMQ:使用 executemany() 时分别确认和拒绝消息
- swift - 在 Apple Watch 的后台检测“屏幕截图”按下
- sql - 选择最大记录