我想通过字符串匹配对数据框的列进行排序。
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/