2017-01-05 25 views
1
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告诉我回答Q1的人的比例,列X0告诉我回答Q0的人的比例。我试过prop.table,但是没有返回想要的结果。总结计数数据在数据中的比例。

回答

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 
+0

没关系,当你是一个有点虚伪评论我的帖子,然后调整我的代码并将其发布到您的代码中。 – akrun

4

我们可以尝试applymargin =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 
+0

感谢,但是如果一个问题有全部为0,那么你的答案没有按没有工作。即'dummy < - data.frame(Q1 = c(0,0,0,0), Q2 = c(1,1,0,1), Q3 = c(0,1,1,0)) ' – Adrian

+0

@Adrian它确实以不同的方式。尝试'应用(虚拟,2,函数(x)表(x)/长度(x))' –

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(从灵感@蛋白酶的使用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 
+0

否则我想你可以用'as。逻辑' – Cath

+6

你知道你可以在其他人的回答下发表评论,而不是使其成为你的(或者是以其他方式),就像我的评论“你也可以使用colSums,将0/1转为逻辑” - 我认为的做法,但决定另一种选择,并根据Ronak的“嘿,你也可以叫表只有一次”...这实际上是你应该做的... – Cath

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 
2

另一种方式做,这将使用do.call & lapply

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

不完全是期望的输出OP正在寻找。 –

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