r - dplyr 根据字符串匹配选择列

标签 r dplyr

我想通过字符串匹配对数据框的列进行排序。

library(dplyr)
data <- data.frame(start_a = 1,
           start_f = 3,
           end_a = 5,
           end_f = 7,
           middle_a= 9,
           middle_f = 11) 
  • 例如,我想选择start_f、start_a、middle_f、middle_a、end_f、end_a
  • 我正在尝试使用 data %>% select(matches("(start|middle|end)_(f|a)"))) 来执行此操作,以便我的顺序在匹配项中输入的是我希望选择列的顺序。
  • 所需的输出为data[c(2,1,6,5,4,3)]

最佳答案

您可以使用 outer 按您想要的顺序构造列.

order1 <- c('start', 'middle', 'end')
order2 <- c('f', 'a')
cols <- c(t(outer(order1, order2, paste, sep = '_')))
cols
#[1] "start_f"  "start_a"  "middle_f" "middle_a" "end_f"    "end_a" 

data[cols]
#  start_f start_a middle_f middle_a end_f end_a
#1       3       1       11        9     7     5

如果不是 order1 的所有组合和order2存在于我们可以使用的数据中any_of它将仅选择 data 中存在的列没有给出任何错误。

library(dplyr)
data %>% select(any_of(cols))

根据名称模式进行选择。

order1 <- c('start', 'middle', 'end')
order2 <- c('f', 'a')
pattern <- c(t(outer(order1, order2, function(x, y) sprintf('^%s_%s.*', x, y))))
pattern
#[1] "^start_f.*"  "^start_a.*"  "^middle_f.*" "^middle_a.*" "^end_f.*" "^end_a.*" 
cols <- names(data)

data[sapply(pattern, function(x) grep(x, cols))]

#  start_f start_a middle_f middle_a end_f end_a
#1       3       1       11        9     7     5

关于r - dplyr 根据字符串匹配选择列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66007305/

相关文章:

r - dplyr 使用可变列进行变异

r - 强制 R 输出为最多两位小数的科学记数法

r - 选择数据表中的连续列和非连续列,如 dplyr 的 group_by 中

r - 使用 dplyr 的条件累积和

r - 如何将十六进制代码传递给 ggplot 中的 geom_hline?

r - 如何从一个数据框中的字符中提取字符串并放入新表中

r - 如何使用 dplyr 中的 mutate 创建一系列由指定突变值的向量定义和调用的列?

返回遍历列表列表的循环内列表的名称

r - R 中的数字格式

r - R如何关闭特定错误