Получить все комбинации вектора символов - PullRequest
0 голосов
/ 06 мая 2020

Я пытаюсь написать функцию для динамической group_by каждой комбинации вектора символов.

Вот как я настроил свой список:

stuff <- c("type", "country", "color")
stuff_ListStr <- do.call("c", lapply(seq_along(stuff), function(i) combn(stuff, i, FUN = list)))
stuff_ListChar <- sapply(stuff_ListStr, paste, collapse = ", ")
stuff_ListSym <- lapply(stuff_ListChar, as.symbol)

Затем я бросил ее в al oop.

b <- list()
for (each in stuff_ListSym) {
  a <- answers_wfh %>% 
    group_by(!!each) %>% 
    summarize(n=n())
  b <- append(b, a)
}

Итак, по сути, я хочу воспроизвести это

...     group_by(type),

...     group_by(country),

...     group_by(type, country), 

... и остальные комбинации. Затем я хочу поместить все резюме в один список (список таблиц / списков)

Это совершенно не работает. Это мое сообщение об ошибке: Error: Column `type, country` is unknown.

Мало того, b не дает мне того, что я хочу. Это список длиной 12, когда я ожидал только 2, прежде чем он потерпел неудачу. Один столбик сгруппирован по «типу», а второй - по «стране».

Я новичок в R в целом, но подумал, что аккуратный eval действительно крутой, и хотел попробовать. Здесь есть подсказки?

Ответы [ 2 ]

3 голосов
/ 06 мая 2020

Думаю у вас проблема стандартной оценки. !! иногда недостаточно, чтобы отменить кавычки переменных и заставить dplyr работать. Используйте !!! и rlang::syms для нескольких кавычек

b <- list()
for (each in stuff_ListSym) {
  a <- answers_wfh %>% 
    group_by(!!!rlang::syms(each)) %>% 
    summarize(n=n())
  b <- append(b, a)
}

Я думаю, что lapply будет лучше в вашей ситуации, чем for, так как вы хотите получить list

Поскольку вы используете имена переменных в качестве аргументов функций, вам может быть удобнее использовать data.table, чем dplyr. Если вам нужна эквивалентная реализация data.table:

library(data.table)
setDT(answers_wfh)
lapply(stuff_ListSym, function(g) answers_wfh[,.(n = .N), by = g])

, вы можете взглянуть на это сообщение в блоге , которое я писал на тему SE и NSE в dplyr и data.table

1 голос
/ 06 мая 2020

Думаю, stuff_ListStr достаточно, чтобы получить желаемое. Вы можете использовать group_by_at, который принимает вектор символов.

library(dplyr)
library(rlang)

purrr::map(stuff_ListStr, ~answers_wfh %>% group_by_at(.x) %>% summarize(n=n()))

Лучше использовать count, но count не принимает символьные векторы, поэтому использует некоторую нестандартную оценку.

purrr::map(stuff_ListStr, ~answers_wfh %>% count(!!!syms(.x)))
...