Какая альтернатива устаревшим глаголам dplyr в цикле for? - PullRequest
1 голос
/ 01 октября 2019

Я привык использовать SE версии глаголов dplyr для циклов for и хочу перейти к новой семантике оценки, но я борюсь.

В более старых версиях dplyr я хотел бы сделатьчто-то вроде:

df <- tribble(
  ~x, ~y, ~z,
  "a", 2, "dog",
  "b", 1, "cat",
  "a", 2,  "cat"
)

for (i in names(df %>% select(x,z))){
  print(count_(df,i))
}

# A tibble: 2 x 2
  x         n
  <chr> <int>
1 a         2
2 b         1
# A tibble: 2 x 2
  z         n
  <chr> <int>
1 cat       2
2 dog       1

Я пробовал различные комбинации quo / enquo / !! / !!! и не могу заставить его работать, используя count().

Ответы [ 4 ]

3 голосов
/ 01 октября 2019

Используйте sym, чтобы превратить строку в символ, затем используйте !!, чтобы вставить символ в выражение

for (i in names(df %>% select(x,z))){
  print(count(df, !!sym(i)))
}
3 голосов
/ 01 октября 2019
for(nm in c("x", "z")){
    print(df %>% count(!!as.symbol(nm)))
}
## A tibble: 2 x 2
#  x         n
#  <chr> <int>
#1 a         2
#2 b         1
## A tibble: 2 x 2
#  z         n
#  <chr> <int>
#1 cat       2
#2 dog       1
1 голос
/ 02 октября 2019

Существует отличный пакет с именем wrapr, который имеет функцию let, которая "позволяет выполнять произвольный код с замененными именами переменных". Код более многословен, чем использование !!, но я нахожу его гораздо проще для понимания и менее подвержен ошибкам.

df <- tibble::tribble(
  ~x, ~y, ~z,
  "a", 2, "dog",
  "b", 1, "cat",
  "a", 2,  "cat"
)

for (name in names(df)) {
  wrapr::let(
    alias = list(var = name),
    expr = {
        df %>%
          count(var) %>%
          print()
    }
  )
}
#> # A tibble: 2 x 2
#>   x         n
#>   <chr> <int>
#> 1 a         2
#> 2 b         1
#> # A tibble: 2 x 2
#>       y     n
#>   <dbl> <int>
#> 1     1     1
#> 2     2     2
#> # A tibble: 2 x 2
#>   z         n
#>   <chr> <int>
#> 1 cat       2
#> 2 dog       1

1 голос
/ 02 октября 2019

Есть местоимение данных .data, доступное от rlang . Это местоимение особенно полезно при обращении к именам столбцов со строками, как вы здесь.

Вы можете узнать больше об этом / посмотреть примеры на rlang сайте и в конце rlang 0.4.0выпуск статьи .

for (i in names(df %>% select(x,z))){
     print( count(df, .data[[i]]) )
}
...