将计数数据汇总为data.frame

时间:2017-01-05 08:45:59

标签: r summary

dummy <- data.frame(Q1 = c(0, 1, 0, 1),
                    Q2 = c(1, 1, 0, 1),
                    Q3 = c(0, 1, 1, 0))
df_dummy <- data.frame(Question = c("Q1", "Q2", "Q3"),
                       X1 = c(2/4, 3/4, 2/4),
                       X0 = c(2/4, 1/4, 2/4))

> dummy
  Q1 Q2 Q3
1  0  1  0
2  1  1  1
3  0  0  1
4  1  1  0

> df_dummy
  Question   X1   X0
1       Q1 0.50 0.50
2       Q2 0.75 0.25
3       Q3 0.50 0.50

我有一些数据(dummy),我对Q1,Q2和Q3有二进制响应。我希望以df_dummy中显示的格式汇总我的数据,对于每个问题,列X1告诉我回答1到Q1的人的比例,列X0告诉我回答0到Q0的人的比例。我尝试prop.table,但没有返回所需的结果。

6 个答案:

答案 0 :(得分:4)

我们可以使用apply尝试margin =2,并将每个值的计数除以列中的总长度

t(apply(dummy, 2, function(x) table(x)/length(x)))

#     0    1
#Q1 0.50 0.50
#Q2 0.25 0.75
#Q3 0.50 0.50

答案 1 :(得分:4)

另一种方法是计算1s的比例,然后从中推断0s的比例:

X1 <- colSums(dummy==1)/nrow(dummy)
df_dummy <- data.frame(X1, X0=1-X1)
df_dummy
#     X1   X0
#Q1 0.50 0.50
#Q2 0.75 0.25
#Q3 0.50 0.50

NB,受到@ akrun关于ColMeans的想法的启发:您也可以使用colMeans而不是将colSums除以行数来定义X1:

X1 <- colMeans(dummy==1)
df_dummy <- data.frame(X1, X0=1-X1)
df_dummy
#     X1   X0
#Q1 0.50 0.50
#Q2 0.75 0.25
#Q3 0.50 0.50

答案 2 :(得分:2)

我们可以使用tableprop.table

执行此操作
t(sapply(dummy, function(x) prop.table(table(x))))
#     0    1
#Q1 0.50 0.50
#Q2 0.25 0.75
#Q3 0.50 0.50

或者更有效的方法是拨打table一次

prop.table(table(stack(dummy)[2:1]),1)
#   values
#ind     0    1
#  Q1 0.50 0.50
#  Q2 0.25 0.75
#  Q3 0.50 0.50

或另一种选择是colMeans(灵感来自@ Cath使用colSums

X0 <- colMeans(!dummy)
data.frame(X1 = 1 - X0, X0)
#    X1   X0
#Q1 0.50 0.50
#Q2 0.75 0.25
#Q3 0.50 0.50

答案 3 :(得分:2)

另一种方法是使用do.call&amp; lapply

do.call(cbind,lapply(dummy,function(x) data.frame(table(x))[,2]))
#    Q1 Q2 Q3
[1,]  2  1  2
[2,]  2  3  2

答案 4 :(得分:1)

不如上面的答案那么优雅:

d <- t(dummy)
cbind(X0 = (ncol(d) - rowSums(d)) / ncol(d), X1 = rowSums(d) / ncol(d))

或者,为了避免两次计算相同的东西,并获得数据框:

d <- t(dummy)
i <- ncol(d)
j <- rowSums(d)
data.frame(Question = rownames(d), X0 = (i - j) / i, X1 = j / i)

你去了:

   Question   X0   X1
Q1       Q1 0.50 0.50
Q2       Q2 0.25 0.75
Q3       Q3 0.50 0.50

答案 5 :(得分:1)

tidyverse选项:

library(tidyr)
library(janitor)

dummy %>% gather(question, val) %>%    # reshape to long form
    crosstab(question, val, percent = 'row') %>%    # make crosstab table
    clean_names()    # make it prettier

#>   question   x0   x1
#> 1       Q1 0.50 0.50
#> 2       Q2 0.25 0.75
#> 3       Q3 0.50 0.50