按data.frame中的比例汇总计数数据 dummy-df\u dummy 问题X1-X0 第一季度0.50 0.50 2第2季度0.75 0.25 3第三季度0.50 0.50

按data.frame中的比例汇总计数数据 dummy-df\u dummy 问题X1-X0 第一季度0.50 0.50 2第2季度0.75 0.25 3第三季度0.50 0.50,r,summary,R,Summary,我有一些数据(dummy),其中有对Q1、Q2和Q3的二进制响应。我想以df_dummy中所示的格式总结我的数据,其中对于每个问题,X1列告诉我回答1到Q1的人数比例,X0列告诉我回答0到Q0的人数比例。我尝试了prop.table,但没有返回所需的结果。我们可以尝试apply使用margin=2将每个值的计数除以列中的总长度 dummy <- data.frame(Q1 = c(0, 1, 0, 1), Q2 = c(1, 1, 0, 1),

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

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

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

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

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

我们可以使用
table
prop.table

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

或者更有效的方法是调用
表一次

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

或者另一个选项是
colMeans
(灵感来源于@Cath使用
colSums


X0我们可以使用
table
prop.table

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

或者更有效的方法是调用
表一次

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

或者另一个选项是
colMeans
(灵感来源于@Cath使用
colSums


X0不如上面的答案优雅:

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

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

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

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

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

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

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

另一种方法是使用do.call&lappy

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

另一种方法是使用do.call&lappy

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
tidyverse选项:

library(tidyr)
图书馆(看门人)
虚拟%>%
聚集(问题,val)%>%#重塑为长形
tabyl(问题,val)%>%#制作交叉表
装饰百分比(“行”)%>%
干净的名字()
问题x0-x1
第一季度0.50 0.50
Q2 0.25 0.75
第三季度0.50 0.50
一个整洁的选择:

library(tidyr)
图书馆(看门人)
虚拟%>%
聚集(问题,val)%>%#重塑为长形
tabyl(问题,val)%>%#制作交叉表
装饰百分比(“行”)%>%
干净的名字()
问题x0-x1
第一季度0.50 0.50
Q2 0.25 0.75
第三季度0.50 0.50

否则我想你可能会选择
作为.logical
你知道你可以在其他人的答案下发表评论,而不是让它成为你的答案(以这样或那样的方式),比如在我的“嘿,你也可以使用colSums,将0/1转换为logical”下发表评论,我曾想过这样做,但决定使用另一个选项,在Ronak的选项下“嘿,你也只能调用table一次”…这实际上是你应该做的…否则我想你可能会选择
as.logical
你知道你可以在其他人的答案下发表评论,而不是让它成为你的答案(以这样或那样的方式),就像在我的答案下发表评论一样“嘿,你也可以使用colSums,将0/1变成logical“-这是我想做的,但决定做另一个选择,在Ronak的“嘿,你也只能给桌子打一次电话”。。。这其实是你应该做的…没关系,当你在我的帖子上发表评论,然后调整我的代码并将其发布到你的帖子中时,这有点虚伪。没关系,当你在我的帖子上发表评论,然后调整我的代码并将其发布到你的帖子中时,这有点虚伪。不完全是OP期望的输出。不完全是OP期望的输出。谢谢,但是如果一个问题都是0,那么你的答案就不起作用。i、 e
dummy@Adrian实际上是这样,但方式不同。尝试
apply(虚拟,2,函数(x)表(x)/长度(x))
谢谢,但是如果一个问题都是0,那么你的答案就不起作用了。i、 e
dummy@Adrian实际上是这样,但方式不同。尝试应用(虚拟,2,函数(x)表(x)/长度(x))