首页 > 解决方案 > 在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?我尝试使用filterselectsubset无济于事,但在这种情况下我可能会错误地使用它们。

标签: rdplyrfiltering

解决方案


您可以使用select_ifwhich 是以下范围的变体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


推荐阅读