如何反转dplyr :: select的辅助函数?

时间:2017-08-29 14:31:23

标签: r dplyr

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

例如,假设我想选择mtcars数据框中没有字母“m”的所有列。我可以想象做类似的事情:

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

但是这会引发错误:

Error: !matches("m") must resolve to integer column positions, not a logical vector

如何编写辅助函数来反转它?

重要提示:一种可能性是使用matches()并编写一个不匹配的正则表达式,但我更感兴趣的是找到一种方法来维护辅助函数的简单性但是反转选择它们返回,而不是解决实际的“如何选择这样的”问题。

1 个答案:

答案 0 :(得分:12)

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

考虑到这一点,我们所要做的就是使功能变为负面:

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

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

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

这解释了R抛出的错误 - import "fmt" import "time" func main() { string_slice:=[]string{"a","b","c"} for _,s:=range string_slice{ go func(){ time.Sleep(1*time.Second) fmt.Println(s) }() } time.Sleep(3*time.Second) } 想要一个整数列表,对应于列索引,而不是逻辑值的向量。