R语言新增列统计另一列唯一值分组总次数的实现方法
R按分组值统计频数并新增列的简洁实现
你不需要手动构造频数表再做表连接,以下两种方法都可以用极短的代码实现需求:
方法1:dplyr 实现(最推荐,代码可读性最高)
直接使用dplyr内置的add_count()函数,这是专门为「分组统计频数并将结果回填到原数据集每一行」设计的函数,不需要多余的中间步骤:
library(dplyr) # 构造示例数据 x <- c("1", "1", "1", "1", "2", "2", "2", "3", "3", "3", "4", "4", "5", "6", "6", "6") y <- c("Y", "Y", "Y", "Y", "N", "N", "Y", "Y", "Y", "Y", "Y", "Y", "Y", "N", "Y", "Y") df <- data.frame(x, y) # 一行代码新增计数列z df <- df %>% add_count(x, name = "z")
运行结果和你给出的期望输出完全一致。如果需要统计多列组合的出现次数,只需要在add_count()里依次传入列名即可,比如add_count(x, y, name = "xy_combo_count")。
方法2:基础R实现(无需加载第三方包)
如果不想依赖tidyverse生态,可以用基础R函数一行实现:
# 写法1:用ave函数 df$z <- as.integer(ave(df$x, df$x, FUN = length)) # 写法2:用table匹配 df$z <- unname(table(df$x)[df$x])
两种基础R写法的运行结果和dplyr方法完全一致。
你原来的写法冗余点在于:不需要加载
plyr/purrr/ggtext/stringr这些和当前需求无关的包,也不需要手动重命名频数表列名、用reduce做连表,内置函数已经把这些步骤封装好了。
内容的提问来源于stack exchange,提问作者zerberus
相关产品推荐
相关产品推荐

