在R语言中为数据集添加列以统计A列值的重复次数
给data.frame添加列展示分组重复次数的简便方法
针对你的需求,这里提供两种简洁的实现方式,同时说明你之前代码无效的原因:
Base R 方案
用ave()函数可以一步到位,直接按A列分组计算每个值的出现次数,并自动匹配到每一行:
people$C <- ave(rep(1, nrow(people)), people$A, FUN = sum)
原理很简单:先生成和数据行数一致的全1向量,按A列分组后对这些1求和,得到的就是每个分组的总重复次数,ave会自动把结果对应到原数据的每一行。
tidyverse (dplyr) 方案
如果平时习惯用tidyverse生态,用分组+新增列的方式更直观:
library(dplyr) people <- people %>% group_by(A) %>% mutate(C = n()) %>% ungroup()
group_by(A)按A列分组,mutate(C = n())给每个分组添加当前组的行数(也就是该值的重复次数),最后ungroup()取消分组,避免后续操作受分组状态影响。
你的aggregate代码为什么无效?
你之前写的people <-aggregate(people$A, people, lengths)逻辑不对:aggregate的第二个参数是分组依据(这里会按A和B的组合分组,但B列全为Student,实际等价于按A分组),但lengths在这里的作用对象是分组后的people$A子集,而aggregate默认会将分组后的列简化,导致lengths返回的是单个元素的长度而非分组总长度,所以最终得到的全是1。如果一定要用aggregate,正确的做法是先统计次数再合并,但这种方法远不如前面两种简便:
# aggregate的正确用法(仅作参考) count_df <- aggregate(A ~ A, data = people, FUN = length) colnames(count_df)[2] <- "C" people <- merge(people, count_df, by = "A")
运行上述任意一种推荐方法后,你的people数据框会新增列C,值依次为3、3、3、2、2、1,完全符合需求。
内容的提问来源于stack exchange,提问作者damian fiorotto
相关产品推荐
相关产品推荐

