6

我想从我的小标题中选择以字母 R 结尾并且不以字符串(“hc”)开头的列。例如,如果我有一个如下所示的数据框:

name  hc_1  hc_2  hc_3r  hc_4r  lw_1r  lw_2  lw_3r  lw_4   
Joe   1     2     3      2      1      5     2      2
Barb  5     4     3      3      2      3     3      1

为了做我想做的事,我尝试了很多选择,但我很惊讶这个不起作用:

library(tidyverse)
data %>%
  select(ends_with("r"), !starts_with("hc"))

当我尝试它时,我收到此错误:

错误:!starts_with("hc")必须计算为列位置或名称,而不是逻辑向量

我也尝试过使用 negate() 并得到相同的错误。

library(tidyverse)
data %>%
  select(ends_with("r"), negate(starts_with("hc")))

错误:negate(starts_with("hc"))必须计算列位置或名称,而不是函数

我想将答案保留在 dplyr select 函数中,因为一旦我选择了变量,我最终将通过使用 mutate_at 来反转它们,所以最好有一个整洁的解决方案。

谢谢!

4

2 回答 2

14

我们可以使用-作为starts_with输出不是逻辑向量

library(dplyr)
data %>%
     select(ends_with("r"), -starts_with("hc"))
 #   lw_1r lw_3r
 #1     1     2
 #2     2     3

数据

data <- structure(list(name = c("Joe", "Barb"), hc_1 = c(1L, 5L), hc_2 = c(2L, 
4L), hc_3r = c(3L, 3L), hc_4r = 2:3, lw_1r = 1:2, lw_2 = c(5L, 
3L), lw_3r = 2:3, lw_4 = 2:1), class = "data.frame", row.names = c(NA, 
-2L))
于 2019-08-30T17:09:54.677 回答
5

如果您需要高级正则表达式,请使用matches

library(dplyr)
#Starts with any letter except h or c and ends with an r
df %>% select(matches('^[^hc].*r$'))
  lw_1r lw_3r
1     1     2
2     2     3
于 2019-08-30T17:09:50.053 回答