如何在使用 Dplyr 的 Group_by 和 Summarise_at 时将 na.rm=TRUE 与 n() 一起使用

How to Use na.rm=TRUE with n() While Using Dplyr's Group_by and Summarise_at

library(tidyverse) 

我卡在了本应如此简单的事情上!使用下面的代码,我要做的就是对三个 "Var" 列进行分组和总结。我想要计数和总和(这样我就可以创建三个百分比列,如果你能在你的答案中包含一个简单的方法来完成这个,那么奖励)。但是,我不想包括 NA。使用 "na.rm=TRUE" 从总和中删除 NA 很容易,但我似乎无法弄清楚如何在使用 dplyr::summarise_at 时不将 NA 包括在计数中(使用 n() )。

我是不是漏掉了一些非常简单的东西?

Df%>%group_by(Group)%>%summarise_at(vars(Var1:Var3),funs(n(),sum((.),na.rm=TRUE)))

Group<-c("House","Condo","House","House","House","House","House","Condo")
Var1<-c(0,1,1,NA,1,1,1,0)    
Var2<-c(1,1,1,1,0,1,1,1)
Var3<-c(1,1,1,NA,NA,1,1,0)

Df<-data.frame(Group,Var1,Var2,Var3)

我认为您只需要将 'na.rm()' 参数移回括号中即可。见下文:

Group<-c("House","Condo","House","House","House","House","House","Condo")
Var1<-c(0,1,1,NA,1,1,1,0)    
Var2<-c(1,1,1,1,0,1,1,1)
Var3<-c(1,1,1,NA,NA,1,1,0)

Df<-data.frame(Group,Var1,Var2,Var3)

out <- Df %>%
  group_by(Group) %>% 
  mutate_at(vars(Var1:Var3), funs(total = sum(!(is.na(.))), sum = sum(., na.rm = T))) %>% 
  ungroup()

我认为您的代码非常接近完成工作。我做了一些细微的更改,并提供了一个示例,说明您如何在同一步骤中包含百分比计算(尽管我不确定您的预期输出)。

library(dplyr)
Df %>% 
  group_by(Group) %>% 
  summarise_all(funs(count = sum(!is.na(.)), 
                     sum = sum(.,na.rm=TRUE),
                     pct = sum(.,na.rm=TRUE)/sum(!is.na(.))))

#> # A tibble: 2 x 10
#>    Group Var1_count Var2_count Var3_count Var1_sum Var2_sum Var3_sum
#>   <fctr>      <int>      <int>      <int>    <dbl>    <dbl>    <dbl>
#> 1  Condo          2          2          2        1        2        1
#> 2  House          5          6          4        4        5        4
#> # ... with 3 more variables: Var1_pct <dbl>, Var2_pct <dbl>,
#> #   Var3_pct <dbl>

我还使用了 summarise_all 而不是 summarise_at,因为 summarise_all 适用于所有不是 group 变量的变量。