tablas - separar columnas r
R mueve la columna al último usando dplyr (5)
Como no hay una solución preparada para esto en dplyr, puede definir su propia pequeña función para que lo haga por usted:
move_last <- function(DF, last_col) {
match(c(setdiff(names(DF), last_col), last_col), names(DF))
}
Luego puede usarlo fácilmente en una llamada de select
normal:
mtcars %>% select(move_last(., "mpg")) %>% head()
También puedes mover varias columnas al final:
mtcars %>% select(move_last(., c("mpg", "cyl"))) %>% head()
Y aún puede proporcionar otros argumentos para seleccionar, por ejemplo, para eliminar una columna:
mtcars %>% select(move_last(., "mpg"), -carb) %>% head()
Para un data.frame con n columnas, me gustaría poder mover una columna desde cualquiera de las posiciones 1- (n-1) , para ser la columna nth (es decir, una columna no última para ser la última columna). También me gustaría hacerlo usando dplyr
. Me gustaría hacerlo sin simplemente escribir los nombres de todas las columnas.
Por ejemplo:
data<-data.frame(a=1:5, b=6:10, c=11:15)
Esto funciona, pero no es la manera dplyr
:
data[,c(colnames(data)[colnames(data)!=''b''],''b'')]
Esta es la forma dplyr
de hacer la columna b
primero:
data%>%select(b, everything())
Pero esto no funciona para que la columna b
última:
data%>%select(everything(), b)
Esto funciona, pero requiere que escriba todas las columnas:
data%>%select(a,c,b)
Entonces, ¿hay una manera elegante de hacer esto?
Preguntas relacionadas:
Después de algunos retoques, lo siguiente funciona y requiere muy poca escritura.
data%>%select(-b,b)
Podemos usar
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
O
data %>%
select(matches("[^b]"), matches("b"))
o con el 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
df <-df [, c (que (nombres de grupo (df)! = "YourColumnName"), que (nombres de usuario (df) == "YourColumnName"))]
data%>%select(-b,everything())
moverá la variable b hasta el final.
Esto se debe a que una variable negativa en la primera posición de select provoca un comportamiento especial de select (), que es insertar todas las variables. Luego elimina b, y luego se vuelve a agregar con la parte de todo ().
Explicado por el propio Hadley: https://github.com/tidyverse/dplyr/issues/2838
También vea esta otra respuesta para ver otros ejemplos de cómo mover algunas columnas al final y otras al principio: ¿Cómo funciona la función auxiliar de selección de dplyr todo () se diferencia de copiar?