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

时间:2018-06-22 14:42:28

标签: r dplyr filtering

是否可以使用dplyr根据某种条件过滤出列?这有点令人困惑,因为它与普通过滤相反。

我找不到直接适用于SO的任何内容。找到了thisthis,但他们做的事情不尽相同。

基本上,我不想基于某列的值过滤出行,而是希望根据某行的值删除列。

以下是使用以下数据框的示例:

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无济于事,但是在这种情况下,我可能使用不正确。

2 个答案:

答案 0 :(得分:3)

您可以使用select_if的范围变体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的调用中。

答案 1 :(得分:0)

您可以使用以下方法:

 df <- df %>%
    select(ab, ad)

有关使用此功能的好处是您也不能使用以下想法进行选择:

 df <- df %>%
    select(-ab) 

这将选择所有列,但不选择“ ab”。 希望这是您想要的。