这是我的数据。
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
我想根据mf $ colname命令df列(实际上是带有后缀a和b的对)。排除那些不在mf。
中的列因此输出如下:
df1 <- data.frame(Aa = 1:10, Ab = 11:20, Ba = 21:30, Bb = 31:40,Ca = 41:50, Cb = 51:60,
Da = 51:60, Db = 61:70)
df1
Aa Ab Ba Bb Ca Cb Da Db
1 1 11 21 31 41 51 51 61
2 2 12 22 32 42 52 52 62
3 3 13 23 33 43 53 53 63
4 4 14 24 34 44 54 54 64
5 5 15 25 35 45 55 55 65
6 6 16 26 36 46 56 56 66
7 7 17 27 37 47 57 57 67
8 8 18 28 38 48 58 58 68
9 9 19 29 39 49 59 59 69
10 10 20 30 40 50 60 60 70
编辑:
顺序并不意味着字母顺序。订单基于mf $ colnames
感谢;
主要修改: 我认为我提供的例子很清楚我想做什么,因为我按照巧合的字母顺序排列了我想要的列。但我的意图不是真的。请考虑另一个例子。
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)
df
k1a k1b a1a a1b j1a j1b p1a p1b
1 1 11 21 31 41 51 61 71
2 2 12 22 32 42 52 62 72
3 3 13 23 33 43 53 63 73
4 4 14 24 34 44 54 64 74
5 5 15 25 35 45 55 65 75
6 6 16 26 36 46 56 66 76
7 7 17 27 37 47 57 67 77
8 8 18 28 38 48 58 68 78
9 9 19 29 39 49 59 69 79
10 10 20 30 40 50 60 70 80
mf <- data.frame (SN = 1:5, colname = c("p1", "a1", "j1", "k1", "e1")
mf
SN colname
1 1 p1
2 2 a1
3 3 j1
4 4 k1
5 5 e1
这个期望的输出
df1 <- data.frame ( p1a = 61:70, p1b = 71:80, a1a = 21:30, a1b = 31:40,
j1a = 41:50, j1b = 51:60, k1a = 1:10, k1b = 11:20)
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
答案 0 :(得分:2)
更改回答:
对于更新的问题,我认为你可以按照以下方式进行。给定数据集:
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"))
您可以使用grep()
查找与mf$colnane
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
答案 1 :(得分:0)
我对列名仍然有点不清楚...因为df中的colnames实际上并不与mf中的colname列相同 - 但如果它们是,或者可以扔掉第二个字母在df colnames中,你可以使用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