dplyr在循环中使用complete()来保留因子水平

时间:2018-09-12 11:17:29

标签: r dplyr

我试图在循环中使用摘要后保留因子水平。 我使用模拟数据集复制我的问题。

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 :(得分:1)

您可以使用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