R 如何将汇总计数转换为列联表?

R 如何将汇总计数转换为列联表?,r,crosstab,R,Crosstab,我想使用几个国家人口普查数据的数据框架,并制作一个列联表,其中列/列/总百分比。我正在努力解决的问题是,数据已经以列联表的形式进行了聚合。如何将原始计数转换为列联表 set.seed(1) country <- c(rep("countryA", 6), rep("countryB", 6)) age <- c(rep(c("0-14", "15-24", "25-59"), 2), rep(c("0-18", "18-30", "30-60"), 2)) sex <- rep

我想使用几个国家人口普查数据的数据框架,并制作一个列联表,其中列/列/总百分比。我正在努力解决的问题是,数据已经以列联表的形式进行了聚合。如何将原始计数转换为列联表

set.seed(1)
country <- c(rep("countryA", 6), rep("countryB", 6))
age <- c(rep(c("0-14", "15-24", "25-59"), 2), rep(c("0-18", "18-30", "30-60"), 2))
sex <- rep(c(rep("female", 3), rep("male", 3)), 2)
count <- abs(round(rnorm(12, 1000000, 500000)))
df <- data.frame(country, age, sex, count)
其中row/col/total%应该是可供选择的选项,不一定需要显示在同一个表中。对于最终输出的类,我也很灵活。我想象它是一个列表,但不一定是

我知道prop.table(table(),margins=1/2),janitor::tabyl(),gmodels::CrossTable(),stats::xtabs,experter::contractive.tables以及。我对这些包中的每一个都有一个问题,即它们将单个观察值作为输入,而我无法让它们使用聚合计数


额外好处:除了百分比之外,最好将数据帧重新格式化为计数表,该表与我所展示的一样,但不包括原始数据帧的计数。

一个选项是按“国家”分割数据集,使用
xtabs
创建汇总表,并应用
prop.table

lapply(split(df[-1], df$country), 
        function(x) prop.table(xtabs(count ~ sex + age, droplevels(x))))
这也有可能是OP想要的

lapply(split(df[-1], df$country), function(x) {
   x1 <- xtabs(count ~ sex + age, droplevels(x))
   x2 <- addmargins(x1)
   x2[-nrow(x2),-ncol(x2)] <- x2[-nrow(x2),-ncol(x2)]/x2[nrow(x2),
                      -ncol(x2)]/x2[length(x2)]
   x2})
lappy(拆分(df[-1],df$country),函数(x){

x1对于第一个,我得到“未找到对象‘Sex’”,当我将函数更改为prop.table(xtabs(df$count~df$Sex+df$age,x)),我收到错误“变量‘df$count’的类型无效(NULL)”@TeaTree抱歉,如果您检查我的代码,我没有使用该
$
代码。它也不正确,因为您正在将数据指定为“x”,然后尝试使用“x”中不存在的列名。这里,
df$sex
是来自完整数据集的值。它应该是带有
属性表(xtabs)的公式(count~sex+age,data=df))
OK,当我在我的数据上使用对象‘sex’时,您的第一个建议也会抛出错误“未找到对象‘sex’”,当我逐字使用您的函数时。@TeaTree您指的是
lappy(拆分(df[-1],df$country),函数(x)prop.table(xtabs(count~sex+age,x))
prop.table(xtabs(count~sex+age,data=df))
,根据您的示例,这两种方法都适用于我。如果您的原始数据中没有“sex”列,则在启用字符串作为性别、年龄和国家的因素后会抛出该错误。此解决方案有效。
lapply(split(df[-1], df$country), function(x) {
   x1 <- xtabs(count ~ sex + age, droplevels(x))
   x2 <- addmargins(x1)
   x2[-nrow(x2),-ncol(x2)] <- x2[-nrow(x2),-ncol(x2)]/x2[nrow(x2),
                      -ncol(x2)]/x2[length(x2)]
   x2})