在dplyr(过滤列)R中的条件下选择/删除列

hmh*_*sen 3 filtering r dplyr

有没有办法根据某些条件过滤掉列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"))
Run Code Online (Sandbox Code Playgroud)

我知道这是一个奇怪的数据集,并且列有不同类型的数据。这实际上是问题的原因。我正在努力清理这个。

这是一个base使用传统子集的解决方案,它返回列“ab”和“ad”:

df[, df[2,] == "b"]
Run Code Online (Sandbox Code Playgroud)

有没有办法使用dplyr? 我尝试使用filterselectsubset没有用,但我可能在这种情况下,错误地使用它们。

Geo*_*ood 6

您可以使用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
Run Code Online (Sandbox Code Playgroud)

在这里,我提供了一个函数来查找包含“b”的任何列。

根据您在下面的评论进行编辑:

df %>%
  mutate(row_n = 1:n()) %>%
  select_if(function(x) any(x == "b" & .$row_n == 2))
Run Code Online (Sandbox Code Playgroud)

在这里,我们改变了一个n_row指示行号的变量,然后在对 的调用中添加行号作为条件select_if