R переместить столбец в последний раз с помощью dplyr

Для блока данных с столбцами n я хотел бы иметь возможность перемещать столбец из любой из позиций 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 сделать столбец b первым:

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

Но это не поможет сделать столбец b последним:

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

Это работает, но мне нужно указать все столбцы:

data%>%select(a,c,b)

Итак, есть ли элегантный способ dplyr для этого?

Похожие вопросы:

Ответ 1

После некоторых мастерингов, следующие работы и требует очень мало ввода.

data%>%select(-b,b)

Ответ 2

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

переместит переменную b в конец.

Это связано с тем, что отрицательная переменная в первой позиции select вызывает особое поведение от select(), которое заключается в том, чтобы вставить все переменные. Затем он удаляет b, а затем добавляется обратно со всем() частью.

Объясняется самим Хэдли: https://github.com/tidyverse/dplyr/issues/2838

Также см. этот другой ответ для других примеров того, как перенести некоторые столбцы в конец и другие столбцы в начало: Как функция вспомогательного помощника dplyr все() отличается от копирования?

Ответ 3

Мы можем либо использовать

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

Ответ 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()

Ответ 5

df <- df[, c(which(colnames(df) != "YourColumnName"), which(colnames(df) == "YourColumnName"))]