通过使用 dplyr 对变量进行分组来将多列的响应制成表格

2024-05-01

你好:我是 plyr/dplyr 系列的新手,但很喜欢它。我可以看到它对我自己的工作有巨大的实用性,但我仍在努力解决它。
我有一个如下所示的数据框。

1) 如何为每个非分组变量生成一个表格,以显示分组变量每个值内的响应分布?

2)注意:我确实有一些缺失值,我想将它们从列表中排除。我意识到 summarise_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))

您可以通过以下方式获取计数group对于每个var1, var2, and var3如果您首先将数据框“融化”为长形式,这将“堆叠”这三个var列合并为单列(value),然后创建一个附加列(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, and value,我们最终得到count给我们这三列组合的行数。然后我们只分组group and variable计算每个值的行百分比count对两个分组变量的每个组合都有贡献。 (第二group_by不是必需的,因为 dplyr 会删除 a 之后的最后一个分组变量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
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

通过使用 dplyr 对变量进行分组来将多列的响应制成表格 的相关文章

随机推荐