如何反转辅助函数dplyr::select()
(like matches()
or contains()
)以便我可以选择不包含或不匹配特定字符串的变量?
例如,假设我想选择 mtcars 数据框中没有字母“m”的所有列。我可以想象做类似的事情:
mtcars %>%
select( !matches("m") )
但这会引发错误:
Error: !matches("m") must resolve to integer column positions, not a logical vector
如何编写辅助函数来反转它?
重要提示:一种可能性是使用matches()
并编写一个不匹配的正则表达式,但我更感兴趣的是找到一种方法来保持辅助函数的简单性,但反转它们返回的选择,而不是解决实际的“我如何选择这样的-和-”这样的问题。
辅助函数用于select()
like matches()
, contains()
, starts_with()
依此类推,返回索引值向量。在上面的例子中,如果我们不想要逆,matches("m")
会回来c(1,9)
因为第一列和第九列名称包含“m”。
考虑到这一点,我们所要做的就是使函数为负:
mtcars %>%
select( -matches("m") )
这使得matches("m")
返回一个向量c(-1, -9)
它会取消选择这些列,但保留其他所有内容。
Using !
, 布尔值NOT
,如原始示例所示,将整数值强制为逻辑值,因此而不是c(1,9)
,你最终会得到c(FALSE, FALSE)
因为 1 和 9 都强制TRUE
但随后被反转!
.
这解释了上面 R 抛出的错误——select()
想要一个与列索引相对应的整数列表,而不是逻辑值向量。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)