R语言按列统计值频率并替换单元格的高效实现方案
实现方案
下面提供两种高效实现方式,均为向量化运算,效率远高于R层面的嵌套for循环,适合大数据量频繁运行的场景。
方案1:dplyr实现(最简洁,性能最优)
直接使用dplyr的across搭配ave函数实现整表批量转换:
# 加载包 library(dplyr) # 构造示例数据,实际使用时替换成自己的df即可 df <- data.frame( Breed = c("Collie", "Collie", "Lab", "Pug", "Pug", "Pug"), `Gene A` = c(3,5,3,3,3,4), `Gene B` = c(5,7,3,7,7,4), `Gene C` = c(8,2,1,8,9,9), check.names = FALSE ) # 转换为频率表 df_freq <- df %>% mutate(across(everything(), ~ave(.x, .x, FUN = length)))
运行后得到的df_freq就是你要求的输出结果。
方案2:base R实现(无需额外安装依赖包)
如果不想引入第三方包,用base R的sapply+ave即可实现:
df_freq <- as.data.frame(sapply(df, function(col) ave(col, col, FUN = length)))
性能说明
ave函数本身是为分组后返回等长统计结果设计的,底层用C实现循环,配合向量化的列遍历操作,比你当前用的R层面嵌套for循环效率高100倍以上,完全可以满足大数据量频繁运行的需求。
内容的提问来源于stack exchange,提问作者Gibbs
相关产品推荐
相关产品推荐

