使用dplyr的select和everything()重新排列变量

时间:2019-03-16 22:34:46

标签: r dplyr

我想使用dplyr's selecteverything()在数据框中重新排列变量。

创建数据框。

> 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

所以我的问题是:我可以使用selecteverything()将一些变量移动到列表的开头,将某些变量移动到列表的末尾,而其他所有变量都在中间吗?

2 个答案:

答案 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)

这是一个解决方案。基本上,您选择bc作为第一列和最后一列。其余的列名称可通过以下方式获得: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