R使用dplyr将列移动到最后

时间:2017-05-10 16:14:56

标签: r dplyr

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

例如:

data<-data.frame(a=1:5, b=6:10, c=11:15)

这有效,但不是dplyr方式:

data[,c(colnames(data)[colnames(data)!='b'],'b')]

这是首先制作列dplyr的{​​{1}}方法:

b

但是这不能使列data%>%select(b, everything()) 持续下去:

b

这样可行,但要求我输入所有列:

data%>%select(everything(), b)

那么有一种优雅的dplyr方法吗?

相关问题:

5 个答案:

答案 0 :(得分:51)

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

data%>%select(-b,b)

答案 1 :(得分:26)

data%>%select(-b,everything())

将变量b移动到最后。

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

哈德利自己解释:https://github.com/tidyverse/dplyr/issues/2838

另请参阅另一个答案,了解如何将某些列移至末尾以及将其他列移至开头的其他示例: How does dplyr's select helper function everything() differ from copying?

答案 2 :(得分: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

或者

data %>%
    select(matches("[^b]"), matches("b"))

或使用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

答案 3 :(得分:4)

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

move_last <- function(DF, last_col) {
    match(c(setdiff(names(DF), last_col), last_col), names(DF))
}

然后,您可以在正常的select电话中轻松使用它:

mtcars %>% select(move_last(., "mpg")) %>% head()

您还可以将多列移动到最后:

mtcars %>% select(move_last(., c("mpg", "cyl"))) %>% head()

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

mtcars %>% select(move_last(., "mpg"), -carb) %>% head()

答案 4 :(得分:-1)

DF的百分比抑制率(!哪个(colnames(DF)= “YourColumnName”),其(colnames(DF)== “YourColumnName”))中,c] -df