您可以通过以下方式获取计数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