r - 将 dplyr 与 group_by 一起使用并使用分类变量进行过滤
问题描述
对 R 来说非常新。我有一个基于文本的大型 df,我想执行一些检查。我想检查一个向量中的哪些变量(“颜色”)有两个不同的变量(“a”和“b”)在另一个向量中。这应该是 AND 而不是 OR 类型的查询。df 看起来像这样
数据
structure(list(colour = c("blue", "blue", "red", "red", "red",
"purple", "purple"), letter = c("a", "c", "a", "m", "b", "a",
"b")), class = "data.frame", row.names = c(NA, -7L))
colour letter
blue a
blue c
red a
red m
red b
purple a
purple b
我认为最好的方法是通过子集,这样我得到一个带有相关数据的新 df ('df2'),它应该如下所示:
colour letter
red a
red b
purple a
purple b
我尝试了以下 dplyr 命令,但没有得到正确的结果('blue a' 仍然存在)。
df2<-df%>%group_by(colour)%>%filter(letter %in% c('a','b'))
我会很感激我能得到的任何帮助!
解决方案
letter %in% c('a', 'b')
检查每个字母以查看它是否在集合 { a
, b
} 中(也就是说,它将为每个字母返回 truea
或 b
),并保留它们。您要做的是检查组中是否同时存在a
a和组b
中的 a:
df %>%
group_by(colour) %>%
filter('a' %in% letter & 'b' %in% letter)
## or, if you have more than a couple letters (maybe a vector of letters)
df %>%
group_by(colour) %>%
filter(all(c('a', 'b') %in% letter))
从您的文本或示例中不清楚如果一个组包含 , 和另一个字母,比如 ,应该a
发生b
什么c
。只要其中有一个a
和一个b
,上面的代码就会保留整个组。
如果您只想保留组的a
和b
字母(如果有更多),请保留您拥有的过滤条件:
... filter(all(c('a', 'b') %in% letter), letter %in% c('a', 'b'))
如果您只想保留有而没有其他字母的组a
,b
那么我会这样做:
... filter(all(c('a', 'b') %in% letter) & n_distinct(letter) == 2)
## another alternative
... filter(all(c('a', 'b') %in% letter) & all(letter %in% c('a', 'b')))
推荐阅读
- sql - 使用特殊排序号排序
- java - install4j:是否可以使下一步和完成按钮的行为类似于默认按钮,以便可以使用 Ctrl + Enter 激活它们?
- mysql - ROLLUP 不适用于具有两个聚合值的数学运算的列
- postgresql - Postgres 复制是否支持 DDL 更改?
- javascript - 使用 Strapi API 的 HTTP POST 动态区域数据的正确格式是什么?
- reactjs - React useState 使用 fontawesome 更改图标不更新
- c# - unity 显示符号
- java - 如何在方法中模拟私有方法
- angular - 有没有办法使用角度将对象数组发送到谷歌云翻译 api?
- php - 使用角度 http post 响应数据在页面之间传递数据