对于 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方法吗?
相关问题:
答案 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