从R中的其他数据文件列重新排序数据文件

从R中的其他数据文件列重新排序数据文件,r,dataframe,R,Dataframe,这是我的数据 df <- data.frame(Aa = 1:10, Ab = 11:20,Ca = 41:50, Cb = 51:60, Ba = 21:30, Bb = 31:40, Da = 51:60, Db = 61:70) # actual data has > 6000 columns df Aa Ab Ca Cb Ba Bb Da Db 1 1 11 41 51 21 31 51 61 2 2 12 42 52 22 32 52 62 3 3 13

这是我的数据

df <- data.frame(Aa = 1:10, Ab = 11:20,Ca = 41:50, Cb = 51:60, Ba = 21:30, Bb = 31:40,
Da = 51:60, Db = 61:70) # actual data has > 6000 columns
df 
   Aa Ab Ca Cb Ba Bb Da Db
1   1 11 41 51 21 31 51 61
2   2 12 42 52 22 32 52 62
3   3 13 43 53 23 33 53 63
4   4 14 44 54 24 34 54 64
5   5 15 45 55 25 35 55 65
6   6 16 46 56 26 36 56 66
7   7 17 47 57 27 37 57 67
8   8 18 48 58 28 38 58 68
9   9 19 49 59 29 39 59 69
10 10 20 50 60 30 40 60 70

mf <- data.frame (SN = 1:5, colname = c("A", "B", "C", "D", "E"))
mf 
  SN colname
1  1       A
2  2       B
3  3       C
4  4       D
5  5       E
df 6000列
df
Aa Ab Ca Cb Ba Bb Da Db
1   1 11 41 51 21 31 51 61
2   2 12 42 52 22 32 52 62
3   3 13 43 53 23 33 53 63
4   4 14 44 54 24 34 54 64
5   5 15 45 55 25 35 55 65
6   6 16 46 56 26 36 56 66
7   7 17 47 57 27 37 57 67
8   8 18 48 58 28 38 58 68
9   9 19 49 59 29 39 59 69
10 10 20 50 60 30 40 60 70
mf改变了答案:

对于更新后的问题,我认为您可以按照以下步骤进行操作。给定数据集:

df <- data.frame (k1a = 1:10, k1b = 11:20, a1a = 21:30, a1b = 31:40, 
j1a = 41:50, j1b = 51:60, p1a = 61:70, p1b = 71:80)

mf <- data.frame (SN = 1:5, colname = c("p1", "a1", "j1", "k1", "e1"))
这就变成了:

> df1 
   p1a p1b a1a a1b j1a j1b k1a k1b
1   61  71  21  31  41  51   1  11
2   62  72  22  32  42  52   2  12
3   63  73  23  33  43  53   3  13
4   64  74  24  34  44  54   4  14
5   65  75  25  35  45  55   5  15
6   66  76  26  36  46  56   6  16
7   67  77  27  37  47  57   7  17
8   68  78  28  38  48  58   8  18
9   69  79  29  39  49  59   9  19
10  70  80  30  40  50  60  10  20

我仍然不太清楚列名称…因为df中的colname实际上与mf中的colname列不完全相同--但是如果它们是相同的,或者如果可以扔掉df colname中的第二个字母,您可以使用match()来实现这一点。。。大概是这样的:

ind=match(substr(colnames(df),1,1),mf$colname)

使用此向量索引原始列

df[,订单(ind)]

不匹配的将显示为NA

编辑: 对于您的新示例,它仍然有效:

match(substr(colnames(df), 1 , 2), mf$colname)
ind = match(substr(colnames(df), 1 , 2), mf$colname)
df[,order(ind)]
   p1a p1b a1a a1b j1a j1b k1a k1b
1   61  71  21  31  41  51   1  11
2   62  72  22  32  42  52   2  12
3   63  73  23  33  43  53   3  13
4   64  74  24  34  44  54   4  14
5   65  75  25  35  45  55   5  15
6   66  76  26  36  46  56   6  16
7   67  77  27  37  47  57   7  17
8   68  78  28  38  48  58   8  18
9   69  79  29  39  49  59   9  19
10  70  80  30  40  50  60  10  20

排除意味着虽然mf$colname有E,但没有相应的Ea和Eb列,所以我不想在排序过程中包括A对,那么原始答案应该足够了,对吗?它只是对数据框中的列进行排序。请看我的附加示例,我的观点不是按字母顺序排序。更新了答案,这就是你的意思吗?df中的列名应该按mf$colname列值(即A、B、C、D)的顺序进行缩写,但是因为df中有两个对应的列名-Aa、Ab、Bb、Bb、Ca、Cb、Da,还有Db,你发现我原来的解决方案也适用于你编辑的示例了吗?
df <- data.frame (k1a = 1:10, k1b = 11:20, a1a = 21:30, a1b = 31:40, 
j1a = 41:50, j1b = 51:60, p1a = 61:70, p1b = 71:80)

mf <- data.frame (SN = 1:5, colname = c("p1", "a1", "j1", "k1", "e1"))
df1 <- df[unlist(sapply(as.character(mf$colname),grep,names(df)))]
> df1 
   p1a p1b a1a a1b j1a j1b k1a k1b
1   61  71  21  31  41  51   1  11
2   62  72  22  32  42  52   2  12
3   63  73  23  33  43  53   3  13
4   64  74  24  34  44  54   4  14
5   65  75  25  35  45  55   5  15
6   66  76  26  36  46  56   6  16
7   67  77  27  37  47  57   7  17
8   68  78  28  38  48  58   8  18
9   69  79  29  39  49  59   9  19
10  70  80  30  40  50  60  10  20
match(substr(colnames(df), 1 , 2), mf$colname)
ind = match(substr(colnames(df), 1 , 2), mf$colname)
df[,order(ind)]
   p1a p1b a1a a1b j1a j1b k1a k1b
1   61  71  21  31  41  51   1  11
2   62  72  22  32  42  52   2  12
3   63  73  23  33  43  53   3  13
4   64  74  24  34  44  54   4  14
5   65  75  25  35  45  55   5  15
6   66  76  26  36  46  56   6  16
7   67  77  27  37  47  57   7  17
8   68  78  28  38  48  58   8  18
9   69  79  29  39  49  59   9  19
10  70  80  30  40  50  60  10  20