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
,但没有返回所需的结果。
答案 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)
我们可以使用table
和prop.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