使用dplyr在R中选择不以字符串开头的列

8

我想从我的tibble中选择以字母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将它们反转,因此最好使用整洁的解决方案。

谢谢!

2个回答

18

我们可以使用-,因为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))

谢谢!但是假设我有另一组以jw_1、jw_2r等开头的列,那么我该如何表达我只想要以lw开头且以r结尾的列呢?有没有一种方法将这些要求联系在一起? - J.Sabree
如果你使用 starts_with/end_with 方法,那么你可以使用另一组 -starts_with("jw"),因为这只能匹配单个模式。否则,你可能需要使用 matches,就像其他答案中的 matches("^lw.*r$") 一样。 - akrun
1
好的,谢谢!我本来希望能在选择命令中放置一个&语句,但我想那是不可能的。谢谢! - J.Sabree

6
如果您需要高级的正则表达式,请使用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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接