R 如何选择部分匹配的列进行排序

R 如何选择部分匹配的列进行排序,r,R,我有一个数据帧df。我需要通过将\u case列放在一起、\u control列放在一起、MCI放在一起和unknown放在一起来对列重新排序。我可以通过使用grepl,然后按这个顺序cbind列来实现这一点,但是有没有一种有效的方法来实现这一点 df <- structure(list(Ethnicity = structure(1:4, .Label = c("AA", "Asian", "Hispanic", "

我有一个数据帧
df
。我需要通过将
\u case
列放在一起、
\u control
列放在一起、
MCI
放在一起和
unknown
放在一起来对列重新排序。我可以通过使用grepl,然后按这个顺序cbind列来实现这一点,但是有没有一种有效的方法来实现这一点

df <- structure(list(Ethnicity = structure(1:4, .Label = c("AA", "Asian", 
"Hispanic", "NHW"), class = "factor"), `<65_case` = c(29L, 13L, 
63L, 1215L), `<65_control` = c(0L, 0L, 0L, 0L), `<65_MCI` = c(75L, 
23L, 43L, 385L), `<65_unknown` = c(6L, 5L, 19L, 126L), `<70_case` = c(45L, 
25L, 109L, 2321L), `<70_control` = c(0L, 0L, 0L, 1L), `<70_MCI` = c(124L, 
36L, 76L, 633L), `<70_unknown` = c(14L, 6L, 23L, 166L), `<75_case` = c(73L, 
47L, 167L, 3704L), `<75_control` = c(0L, 0L, 0L, 1L), `<75_MCI` = c(174L, 
52L, 103L, 863L), `<75_unknown` = c(29L, 7L, 33L, 220L)), row.names = c(NA, 
-4L), class = "data.frame")
df这是否有效:

> library(dplyr)    
> df %>% select(ends_with('case'),ends_with('control'),ends_with('MCI'),ends_with('unknown'))
  <65_case <70_case <75_case <65_control <70_control <75_control <65_MCI <70_MCI <75_MCI <65_unknown <70_unknown <75_unknown
1       29       45       73           0           0           0      75     124     174           6          14          29
2       13       25       47           0           0           0      23      36      52           5           6           7
3       63      109      167           0           0           0      43      76     103          19          23          33
4     1215     2321     3704           0           1           1     385     633     863         126         166         220
> 
>库(dplyr)
>df%>%select(以('case')结束,以('control')结束,以('MCI')结束,以('unknown')结束)

像这样?

nms在
select
中的其他有价值的选项是
开始和
结束
> df[-1][order(gsub('(.*)_(.*)','\\2',colnames(df)[-1]))]
  <65_case <70_case <75_case <65_control <70_control <75_control <65_MCI <70_MCI <75_MCI <65_unknown <70_unknown <75_unknown
1       29       45       73           0           0           0      75     124     174           6          14          29
2       13       25       47           0           0           0      23      36      52           5           6           7
3       63      109      167           0           0           0      43      76     103          19          23          33
4     1215     2321     3704           0           1           1     385     633     863         126         166         220
> 
require(tidyverse)

df %>% select(contains("case"), contains("control"), contains("MCI"), contains("unknown"))