Dplyr: выберите имена столбцов, содержащие пробел
df <- structure(list(`a a` = 1:3, `a b` = 2:4), .Names = c("a a", "a b"
), row.names = c(NA, -3L), class = "data.frame")
и данные выглядят как
a a a b
1 1 2
2 2 3
3 3 4
Следующий вызов для выбора
select(df, 'a a')
дает
Error in abs(ind[ind < 0]) :
non-numeric argument to mathematical function
Как я могу выбрать "a" и/или переименовать его на что-то без пробела с помощью select
? Я знаю следующие подходы:
-
names(df)[1] <- "a"
-
select(df, a=1)
-
select(df, ends_with("a"))
но если я работаю над большим набором данных, как я могу получить точное совпадение, не зная номера индекса или похожих имен столбцов?
Ответы
Ответ 1
Вы можете select
использовать переменную с помощью backticks `
.
select(df, `a a`)
# a a
# 1 1
# 2 2
# 3 3
Однако, если ваша основная цель - переименовать столбец, вы можете использовать rename
в пакете plyr
, в котором вы можете использовать как ""
, так и ``
.
rename(df, replace = c("a a" = "a"))
rename(df, replace = c(`a a` = "a"))
Или в base
R:
names(df)[names(df) == "a a"] <- "a"
Более подробное описание использования различных котировок см. в ?Quotes
. Раздел "Имена и Идентификаторы" особенно важен здесь:
другие [синтаксически недействительные] имена могут использоваться при условии, что они цитируются. Предпочтительной цитатой является обратная сторона ".
См. также ?make.names
о действительных именах.
См. также этот пост о переименовании в dplyr
Ответ 2
Некоторые альтернативы обратным выводам, хорошие с dplyr 0.5.0, текущая версия на момент написания этой статьи.
Если вы пытаетесь программно выбрать аргумент в качестве столбца, и вы не хотите переименовывать или делать что-то вроде paste
/sprintf
имя столбца в обратные ссылки, вы можете использовать as.name
в сочетании с нестандартная оценка версии select
, которая select_
:
dplyr::select_(df, as.name("a a"))
Многие из функций dplyr
имеют нестандартные версии. В случае select
в частности, вы также можете использовать стандартную версию вместе с помощником выбора one_of
. См. ?dplyr::select_helpers
для документации:
dplyr::select(df, dplyr::one_of("a a"))