R使用dplyr将列移动到最后

dul*_*aux 40 r dplyr

对于具有n列的data.frame ,我希望能够将列从1-(n-1)个位置中的任何一个移动到第n列(即非最后一列是最后一列).我也想用它来做dplyr.我想这样做,而不是简单地输入所有列的名称.

例如:

data<-data.frame(a=1:5, b=6:10, c=11:15)
Run Code Online (Sandbox Code Playgroud)

这有效,但不是dplyr这样的:

data[,c(colnames(data)[colnames(data)!='b'],'b')]
Run Code Online (Sandbox Code Playgroud)

这是首先dplyr创建列的方法b:

data%>%select(b, everything())
Run Code Online (Sandbox Code Playgroud)

但这不能使列b最后:

data%>%select(everything(), b)
Run Code Online (Sandbox Code Playgroud)

这有效,但要求我输入所有列:

data%>%select(a,c,b)
Run Code Online (Sandbox Code Playgroud)

那么有一种优雅的dplyr方式来做到这一点吗?

相关问题:

dul*_*aux 68

经过一些修补,以下工作,只需要很少的打字.

data%>%select(-b,b)


Art*_*Yip 43

data%>%select(-b,everything())
Run Code Online (Sandbox Code Playgroud)

将变量b移动到最后.

这是因为select的第一个位置的负变量引出select()的特殊行为,即插入所有变量.然后它删除b,然后使用everything()部分添加回来.

由哈德利本人解释:https://github.com/tidyverse/dplyr/issues/2838

另请参阅另一个答案,了解如何将一些列移到末尾以及将其他列移到开头的其他示例: dplyr的select helper函数如何()与复制不同?

  • 如果将多列移到背面,这比dule arnaux的答案还干净。 (3认同)

akr*_*run 10

我们可以使用

data %>%
    select(-one_of('b'), one_of('b'))
#  a  c  b
#1 1 11  6
#2 2 12  7
#3 3 13  8
#4 4 14  9
#5 5 15 10
Run Code Online (Sandbox Code Playgroud)

要么

data %>%
    select(matches("[^b]"), matches("b"))
Run Code Online (Sandbox Code Playgroud)

或与 select_

data %>% 
    select_(.dots = c(setdiff(names(.), 'b'), 'b'))
#  a  c  b
#1 1 11  6
#2 2 12  7
#3 3 13  8
#4 4 14  9
#5 5 15 10
Run Code Online (Sandbox Code Playgroud)

  • +1 用于使用 `one_of` 作为缺失列的保护。结合 Arthur Yip 对 `data %&gt;% select(-one_of('b'),everything())` 的回答,它将被删除的列放回到 Everything() 调用的末尾。 (2认同)

tal*_*lat 5

由于在 dplyr 中没有现成的解决方案,您可以定义自己的小函数来为您完成:

move_last <- function(DF, last_col) {
    match(c(setdiff(names(DF), last_col), last_col), names(DF))
}
Run Code Online (Sandbox Code Playgroud)

然后您可以在正常select调用中轻松使用它:

mtcars %>% select(move_last(., "mpg")) %>% head()
Run Code Online (Sandbox Code Playgroud)

您还可以将多列移动到末尾:

mtcars %>% select(move_last(., c("mpg", "cyl"))) %>% head()
Run Code Online (Sandbox Code Playgroud)

您仍然可以提供其他参数来选择,例如删除列:

mtcars %>% select(move_last(., "mpg"), -carb) %>% head()
Run Code Online (Sandbox Code Playgroud)