2

我有一个包含多个变量的数据框,每个变量的值都为 TRUE、FALSE 或 NA。我正在尝试总结数据,但要让任何事情都按照我想要的方式工作。

names <- c("n1","n2","n3","n4","n5","n6")
groupname <- c("g1","g2","g3","g4","g4","g4")
var1 <- c(TRUE,TRUE,NA,FALSE,TRUE,NA)
var2 <- c(FALSE,TRUE,NA,FALSE,TRUE,NA)
var3 <- c(FALSE,TRUE,NA,FALSE,TRUE,NA)
df <- data.frame(names,groupname,var1,var2,var3)

我正在尝试总结各个组的数据:

G4      TRUE   FALSE   NA
var1    3      1       2
var2    2      2       2
var3    2      2       2

我可以table(groupname,var1)单独完成它们,但我试图将它们全部放在一个表中。有什么建议么?

4

2 回答 2

2

使用dplyr

library(dplyr)
 df %>% gather("key", "value", var1:var3) %>% 
        group_by(key) %>% 
        summarise(true = sum(value==TRUE, na.rm=T),
                  false = sum(!value, na.rm=T),
                  missing = sum(is.na(value)))

#    key  true false missing
#1  var1     3     1       2
#2  var2     2     2       2
#3  var3     2     2       2
于 2017-02-03T14:58:22.820 回答
1

在基础 R 中,您可以使用table来获取计数、lapply遍历变量do.call并将结果放在一起。[根据需要对列进行排序的次要子集。

do.call(rbind, lapply(df[3:5], table, useNA="ifany"))[, c(2,1,3)]
     TRUE FALSE <NA>
var1    3     1    2
var2    2     2    2
var3    2     2    2

如果每个变量都具有所有级别(TRUE、FALSE、NA),这将起作用。如果缺少其中一个级别,您可以table通过给它一个因子变量来告诉它用 0 计数填充它。这是一个例子。

# expand data set
df$var4 <- c(TRUE, NA)

do.call(rbind, lapply(df[3:6],
                 function(i) table(factor(i, levels=c(TRUE, FALSE, NA)),
                                   useNA="ifany")))[, c(2,1,3)]

     FALSE TRUE <NA>
var1     1    3    2
var2     2    2    2
var3     2    2    2
var4     0    3    3
于 2017-02-03T15:09:19.543 回答