r - 在dplyr(过滤列)R中的条件下选择/删除列
问题描述
有没有办法根据某些条件过滤掉列dplyr
?这有点令人困惑,因为它与正常过滤相反。
我找不到任何直接适用于 SO 的东西。找到了这个和这个,但他们做的事情并不完全相同。
基本上,我不想根据列的值过滤掉行,而是想根据行的值删除列。
这是使用以下数据框的示例:
df <- data.frame(aa = c("1", "a", "10.2", "12.1", "8.7"),
ab = c("1", "b", "5.3", "8.1", "9.2"),
ac = c("0", "a", "1.8", "21.5", "16.0"),
ad = c("0", "b", "11.1", "15.9", "23.6"))
我知道这是一个奇怪的数据集,并且这些列具有不同类型的数据。这实际上是问题的原因。我正在尝试清理它。
这是一个base
使用传统子集的解决方案,它返回列“ab”和“ad”:
df[, df[2,] == "b"]
有没有办法做到这一点dplyr
?我尝试使用filter
,select
但subset
无济于事,但在这种情况下我可能会错误地使用它们。
解决方案
您可以使用select_if
which 是以下范围的变体select
:
df %>%
select_if(function(x) any(x == "b"))
# ab ad
# 1 1 0
# 2 b b
# 3 5.3 11.1
# 4 8.1 15.9
# 5 9.2 23.6
在这里,我提供了一个函数来查找包含“b”的任何列。
根据您在下面的评论进行编辑:
df %>%
mutate(row_n = 1:n()) %>%
select_if(function(x) any(x == "b" & .$row_n == 2))
在这里,我们改变一个指示行号的变量n_row
,然后在调用中添加行号作为条件select_if
。
推荐阅读
- php - 在 .htaccess 文件中设置服务器变量是在变量名前加上 REQUEST_
- php - 如何使用 cURL exec PHP 发送文件
- javascript - 如何在鼠标悬停时将 innerHTML 添加到类中?
- c - 当输入的长度超过 C 字符串数组的大小时,有哪些处理方法?
- laravel - 如何在 Laravel 5.5 中重用包含 mysql 获取数据的刀片模板
- html - 角度旋转木马没有给出预期的结果
- google-cloud-dataflow - 动态扩展 Cloud Dataflow 作业
- node.js - AdonisJS 查询无法正常运行
- unix - 打印与正则表达式匹配的文件部分
- java - Maven 测试在终端上失败,但在 IntelliJ 中通过