有没有办法根据某些条件过滤掉列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? 我尝试使用filter,select并subset没有用,但我可能在这种情况下,错误地使用它们。
您可以使用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。