如何用xtabs()程序化按组汇总除指定列外的多变量?
如何程序化将多列传入xtabs函数实现分组汇总
已知xtabs函数结合cbind可以按指定变量分组汇总多列,示例如下:
df<-data.frame(publication_date=c("2015 Jul","2015 Jul","2015 Aug","2015 Aug"), Asym=c(3,5,1,2), Auth=c(5,7,2,3), Cert=c(1,2,3,4)) xtabs(cbind(Auth, Asym, Cert)~., data=df) # 输出结果: # publication_date Auth Asym Cert # 2015 Aug 5 3 7 # 2015 Jul 12 8 3
当数据框包含大量列时,手动写出所有需要汇总的变量名效率极低。尝试以下代码会报错:
xtabs(cbind(df[2:4])~., data=df) xtabs(cbind(names(df[2:4]))~., data=df) # 错误提示:Error in ... variable lengths differ
解决方法
方法1:用do.call调用cbind
通过do.call将目标列的列表传入cbind,再配合公式传入xtabs:
# 选取除第一列外的所有列作为汇总变量 xtabs(do.call(cbind, df[, -1]) ~ publication_date, data = df)
如果分组变量不止一个,用~.表示所有非汇总列作为分组依据:
xtabs(do.call(cbind, df[, -1]) ~ ., data = df)
方法2:构造公式字符串转换为公式对象
先拼接包含所有汇总变量的公式字符串,再转为公式对象:
# 获取所有需要汇总的变量名 sum_vars <- names(df)[-1] # 拼接公式字符串 formula_str <- sprintf("cbind(%s) ~ .", paste(sum_vars, collapse = ", ")) # 传入xtabs xtabs(as.formula(formula_str), data = df)
方法3:用reformulate简化公式构造
reformulate可以更便捷地生成公式,指定响应部分和分组部分:
sum_vars <- names(df)[-1] # 构造响应部分:cbind(变量1,变量2,...) response_part <- sprintf("cbind(%s)", paste(sum_vars, collapse = ", ")) # 生成公式,右侧用"."表示所有非响应变量 formula <- reformulate(".", response = response_part) # 执行汇总 xtabs(formula, data = df)
上述三种方法的输出结果均与手动指定变量的效果一致。
内容的提问来源于stack exchange,提问作者M.Viking
相关产品推荐
相关产品推荐

