是否可以使用dplyr
根据某种条件过滤出列?这有点令人困惑,因为它与普通过滤相反。
我找不到直接适用于SO的任何内容。找到了this和this,但他们做的事情不尽相同。
基本上,我不想基于某列的值过滤出行,而是希望根据某行的值删除列。
以下是使用以下数据框的示例:
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
无济于事,但是在这种情况下,我可能使用不正确。
答案 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”。 希望这是您想要的。