Ответ 1
После некоторых мастерингов, следующие работы и требует очень мало ввода.
data%>%select(-b,b)
Для блока данных с столбцами 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 для этого?
Похожие вопросы:
После некоторых мастерингов, следующие работы и требует очень мало ввода.
data%>%select(-b,b)
data%>%select(-b,everything())
переместит переменную b в конец.
Это связано с тем, что отрицательная переменная в первой позиции select вызывает особое поведение от select(), которое заключается в том, чтобы вставить все переменные. Затем он удаляет b, а затем добавляется обратно со всем() частью.
Объясняется самим Хэдли: https://github.com/tidyverse/dplyr/issues/2838
Также см. этот другой ответ для других примеров того, как перенести некоторые столбцы в конец и другие столбцы в начало: Как функция вспомогательного помощника dplyr все() отличается от копирования?
Мы можем либо использовать
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
Поскольку в 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()
df <- df[, c(which(colnames(df) != "YourColumnName"), which(colnames(df) == "YourColumnName"))]