У меня есть фрейм данных и список столбцов в этом фреймворке, который я хотел бы удалить. Давайте использовать iris
набор данных в качестве примера. Я хотел бы бросить Sepal.Length
и Sepal.Width
и использовать только оставшиеся столбцы. Как это сделать с помощью пакета select
или select_
из dplyr
пакета?
Вот что я пробовал до сих пор:
drop.cols <- c('Sepal.Length', 'Sepal.Width')
iris %>% select(-drop.cols)
Ошибка в -drop.cols: недопустимый аргумент унарного оператора
iris %>% select_(.dots = -drop.cols)
Ошибка в -drop.cols: недопустимый аргумент унарного оператора
iris %>% select(!drop.cols)
Ошибка в! Drop.cols: недопустимый тип аргумента
iris %>% select_(.dots = !drop.cols)
Ошибка в! Drop.cols: недопустимый тип аргумента
Я чувствую, что упускаю что-то очевидное, потому что это кажется довольно полезной операцией, которая уже должна существовать. На Github кто-то опубликовал аналогичную проблему , и Хэдли сказал использовать «отрицательную индексацию». Вот что (я думаю) я пробовал, но безуспешно. Какие-либо предложения?
iris
, но не на моем фактическом фрейме данных (iris
был игрушечным примером). Мой фрейм данных содержит 4558 строк и 147 столбцов. Я получил сообщение об ошибкеError in eval(x$expr, data, x$env) : variable names are limited to 10000 bytes
. Есть идеи, почему это может происходить?select_vars
вместоselect
. Теперь работает отлично!one_of
? Если я чего-то не упускаю, этого нет в документации пакета (help(package='dplyr')
).help(one_of, package = "dplyr")
. По крайней мере, это версия пакета 0.5.0. Но когда есть обновления одного из его пакетов, полезно читать блоги, которые публикует Хэдли. А некоторые функции задокументированы внутри других функций. К сожалению, для этого необходимо прочитать всю документацию, что я обычно делаю, когда хочу что-то, что не сразу очевидно или невозможно с функцией.также попробуйте
## Notice the lack of quotes iris %>% select (-c(Sepal.Length, Sepal.Width))
источник
Кроме того,
select(-one_of(drop.cols))
существует пара других вариантов удаления столбцов с использованием,select()
которые не включают определение всех конкретных имен столбцов (с использованием образцов данных dplyr starwars для большего разнообразия имен столбцов):starwars %>% select(-(name:mass)) %>% # the range of columns from 'name' to 'mass' select(-contains('color')) %>% # any column name that contains 'color' select(-starts_with('bi')) %>% # any column name that starts with 'bi' select(-ends_with('er')) %>% # any column name that ends with 'er' select(-matches('^f.+s$')) %>% # any column name matching the regex pattern select_if(~!is.list(.)) %>% # not by column name but by data type head(2) # A tibble: 2 x 2 homeworld species <chr> <chr> 1 Tatooine Human 2 Tatooine Droid
источник
select_if(~!is.list(.))
эквивалентselect_if(is.list(.))
?~
это сокращенное обозначение purrr для определения анонимной функции, это не еще один символ для not. Например, эти два значения означают одноfunction(x) {!is.list(x)}
и то же и~!is.list(.)
. Считайте~
это сокращением дляfunction(.)
.Будьте осторожны с этой
select()
функцией, потому что она используется как в пакетах dplyr, так и в MASS, поэтому, если MASS загружен, select () может работать некорректно. Чтобы узнать, какие пакеты загружены, введитеsessionInfo()
и найдите его в разделе «другие прикрепленные пакеты:». Если он загружен, введитеdetach( "package:MASS", unload = TRUE )
, и вашаselect()
функция должна снова заработать.источник
dplyr::select()
.dselect <- dplyr::select()
.Мы можем попробовать
источник
dplyr
способности сделать базовые задачи анализа легкими для чтения и записи, я разочарован тем, что реальное решение выглядит как обходной путь.one_of
другое решение - это то, что нужно. Я забыл об этом.Другой способ - изменить нежелательные столбцы, чтобы
NULL
избежать использования встроенных круглых скобок:head(iris,2) %>% mutate_at(drop.cols, ~NULL) # Petal.Length Petal.Width Species # 1 1.4 0.2 setosa # 2 1.4 0.2 setosa
источник
Если у вас есть специальный символ в именах столбцов, либо
select
илиselect_
не может работать , как ожидалось. Это свойствоdplyr
использования"."
. Чтобы обратиться к набору данных в вопросе, для решения этой проблемы можно использовать следующую строку:drop.cols <- c('Sepal.Length', 'Sepal.Width') iris %>% .[,setdiff(names(.),drop.cols)]
источник
Можешь попробовать
источник