为嵌套列表分组内的数据框计算height列众数并添加新列
问题与解决方案
问题背景
我有一个名为data的嵌套列表,包含10个元素(每个元素本身也是列表)。执行lengths(data)得到结果[1] 26 33 3 20 22 21 17 18 12 29,即第一个元素包含26个tibble数据框,第二个包含33个,以此类推。
每个数据框的列结构统一:
- 前4列:整数型,列名依次为
width、height、x、y - 第5列:逻辑型,列名
space - 第6列:字符型,列名
text
所有数据框行数各不相同。
需求:将data的每个外层元素作为一组,计算该组内所有数据框height列的众数,再将这个众数作为新列添加到组内的每个数据框中,方便后续对height值与众数的关系进行分类操作。
现有尝试代码
getmode <- function(v) { uniqv <- unique(v) uniqv[which.max(tabulate(match(v, uniqv)))] } mode <- lapply(data, function(x) lapply(lapply(x, '[[', 'height'), getmode)) # 计算每个组内单个数据框的height众数 mode2 <- lapply(mode, function (x) getmode(x)) # 基于单个数据框的众数,再计算组的众数
修正后的完整代码
# 定义众数函数:处理空值与多众数场景,默认返回第一个众数 getmode <- function(v) { if (length(v) == 0) return(NA) uniqv <- unique(v) counts <- tabulate(match(v, uniqv)) max_count <- max(counts) # 若需返回所有众数,移除[1]即可 uniqv[counts == max_count][1] } # 处理嵌套列表,为每个组添加组级height众数列 data_with_mode <- lapply(data, function(group) { # 合并组内所有数据框的height列,得到全组height向量 all_group_heights <- unlist(lapply(group, function(df) df[["height"]])) # 计算组的height众数 group_height_mode <- getmode(all_group_heights) # 为组内每个数据框新增height_mode列 lapply(group, function(df) { df$height_mode <- group_height_mode df }) })
代码说明
- 众数函数优化:新增空值判断,避免空向量报错;同时支持处理多众数情况(若多个值出现次数相同且最多,默认返回第一个,可根据需求调整为返回所有众数)。
- 组级众数计算:直接合并组内所有数据框的
height列计算众数,比先算单个数据框众数再二次取众数的方式更准确,能真实反映整个组的height分布特征。 - 批量添加新列:遍历组内每个数据框,统一添加
height_mode列,值为该组的height众数,保证组内所有数据框的新列值一致。
内容的提问来源于stack exchange,提问作者Miroslav
相关产品推荐
相关产品推荐

