从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