粘贴到tidyverse' select()

时间:2017-11-23 03:31:18

标签: r dplyr tidyverse

我正在处理的数据集看起来像这样

a   b     vara_1 vara_2 vara_3 vara_4 vara_5 .... varb_1 varb_2 varb_3 varb_4
-----------------------------------------------------------------------------
100 120   a      b      c      d      e           w      x      y      z

我想根据paste0函数生成的特定顺序更改数据集的列顺序:

> paste0(c("vara_", "varb_"),rep(1:10, each=2))
 [1] "vara_1"  "varb_1"  "vara_2"  "varb_2"  "vara_3"  "varb_3"  "vara_4"  "varb_4"  "vara_5"  "varb_5" 
[11] "vara_6"  "varb_6"  "vara_7"  "varb_7"  "vara_8"  "varb_8"  "vara_9"  "varb_9"  "vara_10" "varb_10"

因此数据集的最终外观将变为

a   b     vara_1 varb_1 vara_2 varb_2 vara_3 varb_3 ....
-----------------------------------------------------------------------------
100 120   a      w      b      x      c      y  ....

无论如何都要把它放到tidyverse的select()函数可读的格式中吗?

我试过了

condition <- paste0(c("vara_", "varb_"),rep(1:10, each=2)
data <- data %>% select(a, b, condition)

以及data <- data %>% noquote(select(a, b, condition))没有运气。

是否可以为select()列出所有变量/列顺序?任何有助于实现相同目标的帮助或替代方式都值得赞赏!

2 个答案:

答案 0 :(得分:3)

您应该使用select_at而不是select

数据

df <- data.frame(a=100, b=120, vara_1="a", vara_2 = "b", vara_3 = "c",
            varb_1 = "d", varb_2 = "e", varb_3 = "f")

    # a   b vara_1 vara_2 vara_3 varb_1 varb_2 varb_3
# 1 100 120      a      b      c      d      e      f

指定列

thesecols <- c("a", "b", paste0(c("vara_", "varb_"),rep(1:3, each=2)))

使用select_at

library(dplyr)
df %>%
    select_at(vars(thesecols))

    # a   b vara_1 varb_1 vara_2 varb_2 vara_3 varb_3
# 1 100 120      a      d      b      e      c      f

答案 1 :(得分:2)

您可以syms!!!一起使用select函数中的特定顺序拼接列名:

library(rlang)
condition <- paste0(c("vara_", "varb_"),rep(1:10, each=2))
data %>% select(a, b, !!!syms(condition))
#  a b vara_1 varb_1 vara_2 varb_2 vara_3 varb_3 vara_4 varb_4 vara_5 varb_5 vara_6 varb_6 vara_7 varb_7 vara_8 varb_8 vara_9 varb_9 vara_10 varb_10
#1 1 2      3     13      4     14      5     15      6     16      7     17      8     18      9     19     10     20     11     21      12      22

虚拟数据

dput(data)
structure(list(a = 1L, b = 2L, vara_1 = 3L, vara_2 = 4L, vara_3 = 5L, 
    vara_4 = 6L, vara_5 = 7L, vara_6 = 8L, vara_7 = 9L, vara_8 = 10L, 
    vara_9 = 11L, vara_10 = 12L, varb_1 = 13L, varb_2 = 14L, 
    varb_3 = 15L, varb_4 = 16L, varb_5 = 17L, varb_6 = 18L, varb_7 = 19L, 
    varb_8 = 20L, varb_9 = 21L, varb_10 = 22L), .Names = c("a", 
"b", "vara_1", "vara_2", "vara_3", "vara_4", "vara_5", "vara_6", 
"vara_7", "vara_8", "vara_9", "vara_10", "varb_1", "varb_2", 
"varb_3", "varb_4", "varb_5", "varb_6", "varb_7", "varb_8", "varb_9", 
"varb_10"), row.names = c(NA, -1L), class = "data.frame")