R语言中使用aggregate与table函数统计不同STATUS对应的variant数量的方法
原代码输出晦涩的核心原因
- 分组逻辑和需求不匹配:你需要统计不同STATUS分组下各variant类型的样本数量,但原代码将variant设为分组键、把STATUS作为待统计的向量,统计维度和目标错位
- 输出结构未做规范化命名:传入
by = list(tt$variant)时没有给列表元素自定义名称,aggregate会默认将分组列命名为Group.1,待统计结果列统一命名为x;加上table函数返回的是嵌套结构,最终x列的每个单元格会内嵌一个table对象,不会自动展开为独立的数值列,这就是输出列名晦涩、难以解读的直接原因
匹配需求的正确实现(仅使用base R的aggregate、table函数)
- 调整统计逻辑:将待统计向量设为variant,分组键设为STATUS,同时为分组列指定易读的名称,修正后代码为:
aggregate(tt$variant, by = list(STATUS = tt$STATUS), table) - 该代码运行后会自动展开table的结构为扁平化数值列,输出参考:
STATUS 0/0 0/1 1/1
1 1 0 3 2
2 -9 5 0 1 - 若需求反向,需要按variant分组、计数组内不同STATUS的样本数量,只需将两个向量的位置对调,对应代码为:
aggregate(tt$STATUS, by = list(variant = tt$variant), table)
输出参考:variant 1 -9
1 0/0 5 0
2 0/1 3 0
3 1/1 2 1
实用优化技巧
- 避免不同分组下因缺失某类值导致的列数错乱:因为tt中的variant、STATUS都是factor类型,若某分组下完全缺失某类取值,table函数返回的向量长度会不一致,导致aggregate输出结构错位。可以通过固定factor层级的方式优化代码:
aggregate(tt$variant, by = list(STATUS = tt$STATUS), function(x) table(factor(x, levels = levels(tt$variant))))
该写法会强制每个分组的table输出固定维度,不会因缺项出现列数不一致的问题
内容的提问来源于stack exchange,提问作者Yamuna_dhungana
相关产品推荐
相关产品推荐

