使用dplyr汇总进行清点时省略NAs

使用dplyr汇总进行清点时省略NAs,r,dplyr,R,Dplyr,我的问题涉及使用dplyr中的summary_each函数对具有多列(50列)的数据帧进行汇总。 列中的数据项是二进制的(0=负,1=正),我的目标是得到colsums和正百分比。 问题是有些列有NAs,我希望在计算总数和百分比时排除这些。 下面是一个简单的例子: library(dplyr) library(tidyr) df=data.frame( x1=c(1,0,0,NA,0,1,1,NA,0,1), x2=c(1,1,NA,1,1,0,NA,NA,0,1), x3=c(0,

我的问题涉及使用dplyr中的
summary_each
函数对具有多列(50列)的数据帧进行汇总。 列中的数据项是二进制的(0=负,1=正),我的目标是得到colsums和正百分比。 问题是有些列有NAs,我希望在计算总数和百分比时排除这些。 下面是一个简单的例子:

library(dplyr)
library(tidyr)
df=data.frame(
  x1=c(1,0,0,NA,0,1,1,NA,0,1),
  x2=c(1,1,NA,1,1,0,NA,NA,0,1),
  x3=c(0,1,0,1,1,0,NA,NA,0,1),
  x4=c(1,0,NA,1,0,0,NA,0,0,1),
  x5=c(1,1,NA,1,1,1,NA,1,0,1))

> df
   x1 x2 x3 x4 x5
1   1  1  0  1  1
2   0  1  1  0  1
3   0 NA  0 NA NA
4  NA  1  1  1  1
5   0  1  1  0  1
6   1  0  0  0  1
7   1 NA NA NA NA
8  NA NA NA  0  1
9   0  0  0  0  0
10  1  1  1  1  1

df %>%
  summarise_each(funs(total.count=n(), positive.count=sum(.,na.rm=T),positive.pctg=sum(.,na.rm=T)*100/n())) %>%
  gather(key,fxn,x1_total.count:x5_positive.pctg) %>%
  separate(key,c("col","funcn"),sep="\\_") %>%
  spread(funcn,fxn)

  col positive.count positive.pctg total.count
1  x1              4            40          10
2  x2              5            50          10
3  x3              4            40          10
4  x4              3            30          10
5  x5              7            70          10
例如,我希望在上表中得到x1的总数(total.count),如下所示:

length(df$x1[!is.na(df$x1)])

[1] 8
sum(df$x1,na.rm=T)/length(df$x1[!is.na(df$x1)])

[1] 0.5
相反,我得到了以下等价物,其中包括NAs:

length(df$x1)

[1] 10
sum(df$x1,na.rm=T)/length(df$x1)

[1] 0.4
我还希望x1的百分比(正值.pctg)为:

length(df$x1[!is.na(df$x1)])

[1] 8
sum(df$x1,na.rm=T)/length(df$x1[!is.na(df$x1)])

[1] 0.5
相反,我得到了以下等价物,其中包括NAs:

length(df$x1)

[1] 10
sum(df$x1,na.rm=T)/length(df$x1)

[1] 0.4
如何在dplyr ommiting NAs中进行计数?函数
n()
length()
似乎不接受任何 像
na.omit/na.rm/complete.cases这样的参数
。 如蒙协助,将不胜感激

试试看

df %>%
    summarise_each(funs(total.count=sum(!is.na(.)), positive.count=sum(.,na.rm=T),positive.pctg=sum(.,na.rm=T)*100/sum(!is.na(.))))%>%
    gather(key,fxn,x1_total.count:x5_positive.pctg) %>%
    separate(key,c("col","funcn"),sep="\\_") %>%
    spread(funcn,fxn)