[英]Tabulate responses for multiple columns by grouping variable with dplyr
嗨:我是plyr / dplyr家族的新手但享受它。 我可以看到它对我自己的工作来说是巨大的效用,但我仍然试图让我的头脑绕过它。
我有一个如下所示的数据框。
1)如何为每个非分组变量生成一个表,该表显示分组变量的每个值内的响应分布?
2)注意:我确实有一些缺失值,我想将它们从列表中排除。 我意识到summarize_each命令会将函数应用于每一列,但我不知道如何以一种简单的方式处理缺失值问题。 我已经看到一些代码建议你必须过滤掉缺失的值,但是如果缺失值是通过非分组变量随机分散的呢?
3)从根本上说,最好只使用dplyr的完整案例吗?
#library
library(dplyr)
#sample data
group<-sample(c('A', 'B', 'C'), 100, replace=TRUE)
var1<-sample(c(1,2,3,4,5,NA), 100, replace=TRUE, prob=c(0.15,0.15,0.15,0.15,0.15,0.25))
var2<-sample(c(1,2,3,4,5,NA), 100, replace=TRUE, prob=c(0.15,0.15,0.15,0.15,0.15,0.25))
var3<-sample(c(1,2,3,4,5,NA), 100, replace=TRUE, prob=c(0.15,0.15,0.15,0.15,0.15,0.25))
df<-data.frame(group, var1, var2, var3)
#my code
out_df<-df %>%group_by(group)
out_df %>% summarise_each(funs(table))
如果先将数据框“熔化”为长格式,将三个var
列“堆叠”到一个列( value
)中,然后创建一个附加列,则可以按group
分别为var1
, var2
和var3
获取计数( variable
),标志着该行与去var
。
library(dplyr)
library(reshape2)
#sample data
group <- sample(c('A', 'B', 'C'), 100, replace=TRUE)
var1 <- sample(c(1,2,3,4,5,NA), 100, replace=TRUE, prob=c(0.15,0.15,0.15,0.15,0.15,0.25))
var2 <- sample(c(1,2,3,4,5,NA), 100, replace=TRUE, prob=c(0.15,0.15,0.15,0.15,0.15,0.25))
var3 <- sample(c(1,2,3,4,5,NA), 100, replace=TRUE, prob=c(0.15,0.15,0.15,0.15,0.15,0.25))
df<-data.frame(group, var1, var2, var3)
out_df <- df %>%
melt(id.var="group") %>%
filter(!is.na(value)) %>% # Remove NA
group_by(group, variable, value) %>%
summarise(count=n()) %>%
group_by(group, variable) %>%
mutate(percent=count/sum(count))
您可以随时停止功能链以查看中间步骤,这将有助于了解每个步骤的作用。
因为我们按group
, variable
和value
分组,所以我们最终得到count
给出了这三列组合的行数。 然后,我们仅按group
和variable
进行group
,以计算每个count
对两个分组变量的每个组合所贡献的行的百分比。 (第二个group_by
不是必需的,因为dplyr在summarise
操作之后删除了最后一个分组变量(因为对于所有原始分组变量的每个组合只有一行)但我更喜欢显式重组。)
这是最终结果:
out_df
group variable value count percent
1 A var1 1 6 0.26086957
2 A var1 2 3 0.13043478
3 A var1 3 6 0.26086957
4 A var1 4 1 0.04347826
5 A var1 5 7 0.30434783
...
41 C var3 1 6 0.25000000
42 C var3 2 5 0.20833333
43 C var3 3 4 0.16666667
44 C var3 4 2 0.08333333
45 C var3 5 7 0.29166667
如果,通过制表你的意思是总和,那么试试这个:
out_df<-df %>%group_by(group)
summarise(out_df,var1=sum(var1,na.rm=TRUE),var2=sum(var2,na.rm=TRUE),var3=sum(var3,na.rm=TRUE))
产生这样的东西:
group var1 var2 var3
1 A 67 72 60
2 B 88 92 97
3 C 54 77 48
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.