You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为嵌套列表分组内的数据框计算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
  })
})

代码说明

  1. 众数函数优化:新增空值判断,避免空向量报错;同时支持处理多众数情况(若多个值出现次数相同且最多,默认返回第一个,可根据需求调整为返回所有众数)。
  2. 组级众数计算:直接合并组内所有数据框的height列计算众数,比先算单个数据框众数再二次取众数的方式更准确,能真实反映整个组的height分布特征。
  3. 批量添加新列:遍历组内每个数据框,统一添加height_mode列,值为该组的height众数,保证组内所有数据框的新列值一致。

内容的提问来源于stack exchange,提问作者Miroslav

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.08 16:05:57