如何反转dplyr::select()(例如matches()contains())的辅助函数,以便可以选择不包含或不匹配特定字符串的变量?

例如,假设我要选择mtcars数据框中的所有不包含字母“m”的列。我可以想象做这样的事情:

mtcars %>%
    select( !matches("m") )

但这引发了错误:
Error: !matches("m") must resolve to integer column positions, not a logical vector
如何编写辅助函数以将其反转?

重要说明:一种可能是使用matches()并编写不匹配的正则表达式,但我对寻找一种方法来保持助手功能的简单性但反转它们返回的选择而不是真正解决实际问题更感兴趣“我该如何选择某某”问题。

最佳答案

select()的辅助函数(如matches()contains()starts_with()等)返回索引值的向量。在上面的示例中,如果我们不想取反,则matches("m")将返回c(1,9),因为第一和第九列名称包含“m”。

考虑到这一点,我们要做的就是使函数为负:

mtcars %>%
    select( -matches("m") )

这使得matches("m")返回c(-1, -9)的向量,该向量取消选择了那些列,但保留了其他所有内容。

如原始示例所示,使用!( bool NOT)将整数值强制转换为逻辑值,因此,代替c(1,9),您最终得到c(FALSE, FALSE),因为1和9都强制转换为TRUE,但随后被!反转。

这就解释了R抛出的错误-select()想要一个与列索引相对应的整数列表,而不是逻辑值的向量。

关于r - 如何反转dplyr::select的辅助函数?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/45941791/

10-12 17:45