Подтвердить что ты не робот

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"))

но если я работаю над большим набором данных, как я могу получить точное совпадение, не зная номера индекса или похожих имен столбцов?

4b9b3361

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