对于具有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方式来做到这一点吗?
相关问题:
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函数如何()与复制不同?
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)
由于在 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)