在R中如何实现基于指定列求和的类table功能?
在R中如何实现基于指定列求和的类table功能?
嗨,这个需求完全可以用R里已有的函数实现,我给你分享几个简单又好用的方法:
方法一:用xtabs()函数(最直接的原生解法)
xtabs()就是专门用来做加权交叉表的原生函数,完美匹配你的需求。它的语法很直观,用公式指定要聚合的数值列和分类列就行:
# 直接运行这行代码就能得到你想要的结果 xtabs(freq ~ x + y, data = example)
运行后输出的结果就是:
y x FALSE TRUE FALSE 27 44 TRUE 8 177
完全和你期望的结果一致!这个函数会自动按照x和y的每个组合,把对应的freq值加总,比手动分组求和高效多了。
方法二:用tidyverse系列的dplyr+tidyr(适合熟悉tidy语法的场景)
如果你平时更习惯用tidyverse的工作流,也可以用分组求和再转宽表的方式实现:
library(dplyr) library(tidyr) example %>% group_by(x, y) %>% summarise(total = sum(freq), .groups = "drop") %>% pivot_wider(names_from = y, values_from = total, values_fill = 0)
运行后会得到一个数据框格式的结果:
# A tibble: 2 × 3 x FALSE TRUE <chr> <dbl> <dbl> 1 FALSE 27 44 2 TRUE 8 177
如果需要转成和table()输出更像的矩阵形式,再加一步column_to_rownames("x") %>% as.matrix()就行。
小补充
本质上这两种方法都是先按x和y的所有组合分组,然后对每组对应的freq列求和。xtabs()是原生函数,适合快速得到类似table的矩阵结果;而tidyverse的方法更灵活,方便后续对结果做进一步的清洗或可视化。
备注:内容来源于stack exchange,提问作者camtastic
相关产品推荐
相关产品推荐

