我想使用dplyr's
select
和everything()
在数据框中重新排列变量。
创建数据框。
> library(dplyr)
> X <- tibble(a = seq(0, 10),
b = seq(10, 20),
c = seq(20, 30),
d = seq(30, 40),
e = seq(40, 50))
我可以将c
移到列表的开头。
> X %>% select(c, everything())
# A tibble: 11 x 5
c a b d e
<int> <int> <int> <int> <int>
1 20 0 10 30 40
2 21 1 11 31 41
3 22 2 12 32 42
4 23 3 13 33 43
5 24 4 14 34 44
6 25 5 15 35 45
7 26 6 16 36 46
8 27 7 17 37 47
9 28 8 18 38 48
10 29 9 19 39 49
11 30 10 20 40 50
但是,如果我想将c
移到列表的末尾,这将不起作用。
> X %>% select(everything(), c)
# A tibble: 11 x 5
a b c d e
<int> <int> <int> <int> <int>
1 0 10 20 30 40
2 1 11 21 31 41
3 2 12 22 32 42
4 3 13 23 33 43
5 4 14 24 34 44
6 5 15 25 35 45
7 6 16 26 36 46
8 7 17 27 37 47
9 8 18 28 38 48
10 9 19 29 39 49
11 10 20 30 40 50
但是,以下操作完成了将c
移至结尾的操作。
> X %>% select(-c, everything(), c)
# A tibble: 11 x 5
a b d e c
<int> <int> <int> <int> <int>
1 0 10 30 40 20
2 1 11 31 41 21
3 2 12 32 42 22
4 3 13 33 43 23
5 4 14 34 44 24
6 5 15 35 45 25
7 6 16 36 46 26
8 7 17 37 47 27
9 8 18 38 48 28
10 9 19 39 49 29
11 10 20 40 50 30
但是我们两者都能做到吗?即我们可以将某些东西移到最前面吗?例如,我可以将b
移到前面,将c
移到最后吗?
这不起作用。 c
需要移到最后。
> X %>% select(b, -c, everything(), c)
# A tibble: 11 x 5
b a c d e
<int> <int> <int> <int> <int>
1 10 0 20 30 40
2 11 1 21 31 41
3 12 2 22 32 42
4 13 3 23 33 43
5 14 4 24 34 44
6 15 5 25 35 45
7 16 6 26 36 46
8 17 7 27 37 47
9 18 8 28 38 48
10 19 9 29 39 49
11 20 10 30 40 50
这不起作用。 b
不会移到开头。
> X %>% select(-c, b, everything(), c)
# A tibble: 11 x 5
a b d e c
<int> <int> <int> <int> <int>
1 0 10 30 40 20
2 1 11 31 41 21
3 2 12 32 42 22
4 3 13 33 43 23
5 4 14 34 44 24
6 5 15 35 45 25
7 6 16 36 46 26
8 7 17 37 47 27
9 8 18 38 48 28
10 9 19 39 49 29
11 10 20 40 50 30
所以我的问题是:我可以使用select
和everything()
将一些变量移动到列表的开头,将某些变量移动到列表的末尾,而其他所有变量都在中间吗?
答案 0 :(得分:2)
这会将c
移到末尾:
select(X, -c, c)
给予:
# A tibble: 11 x 5
a b d e c
<int> <int> <int> <int> <int>
1 0 10 30 40 20
2 1 11 31 41 21
3 2 12 32 42 22
4 3 13 33 43 23
5 4 14 34 44 24
6 5 15 35 45 25
7 6 16 36 46 26
8 7 17 37 47 27
9 8 18 38 48 28
10 9 19 39 49 29
11 10 20 40 50 30
这会将b移到前面,将c移到结尾:
select(X, b, everything(), -c, c)
给予:
# A tibble: 11 x 5
b a d e c
<int> <int> <int> <int> <int>
1 10 0 30 40 20
2 11 1 31 41 21
3 12 2 32 42 22
4 13 3 33 43 23
5 14 4 34 44 24
6 15 5 35 45 25
7 16 6 36 46 26
8 17 7 37 47 27
9 18 8 38 48 28
10 19 9 39 49 29
11 20 10 40 50 30
答案 1 :(得分:0)
这是一个解决方案。基本上,您选择b
和c
作为第一列和最后一列。其余的列名称可通过以下方式获得:names(X)[!names(X) %in% c("b","c")]
X %>% select(b, names(X)[!names(X) %in% c("b","c")], c)
# A tibble: 11 x 5
b a d e c
<int> <int> <int> <int> <int>
1 10 0 30 40 20
2 11 1 31 41 21
3 12 2 32 42 22
4 13 3 33 43 23
5 14 4 34 44 24
6 15 5 35 45 25
7 16 6 36 46 26
8 17 7 37 47 27
9 18 8 38 48 28
10 19 9 39 49 29
11 20 10 40 50 30