dplyr использует complete () в цикле для сохранения уровней факторов - PullRequest
0 голосов
/ 12 сентября 2018

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

df = data.frame(a=rep(1:3,4), b=rep(1:2,6),c=rep(1:2,6),d=rep(1:2,6))
df$b = factor(df$b, levels=1:3)
#the group are for the loop. Since it's just an example have only 1 value
outer_group <- c("a") 
inner_group <- c("b")

Мой желаемый результат достигается с помощью этого кода ниже. Однако, используя этот подход, мне нужно вручную изменить столбец complete() в случае, если у меня есть несколько значений в цикле

for (o in outer_group){
    for(i in inner_group){
        df %>%
            group_by_at(i) %>%
            summarise(count_a=length(!!o)) %>%
            complete(b) -> a
    }

}

По этой причине я попытался изменить его на complete(!!i), например

for (o in outer_group){
    for(i in inner_group){
        df %>%
            group_by_at(i) %>%
            summarise(count_a=length(!!o)) %>%
            complete(!!i) -> a
    }

}

К сожалению, это не работает

Error: `by` can't contain join column `"b"` which is missing from RHS

Любая помощь приветствуется

Желаемый вывод:

# A tibble: 3 x 2                                  
  b     count_a
  <fct>   <int>
1 1           1
2 2           1
3 3          NA

1 Ответ

0 голосов
/ 12 сентября 2018

Вы можете использовать wrapr::let вместо механизма цитирования dplyr:

library(wrapr)
for (o in outer_group){
   for(i in inner_group){
     let(c(I=i),
        df %>%
          group_by_at(i) %>%
          summarise(count_a=length(!!o)) %>%
          complete(I) -> a)
    }
}
## A tibble: 3 x 2
#  b     count_a
#  <fct>   <int>
#1 1           1
#2 2           1
#3 3          NA
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...