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

如何用purrr::map函数获取嵌套列表中各tibble的Day列最大值

使用purrr包处理嵌套tibble的列计算问题

先定义示例数据:

library(purrr)
library(tibble)

examplelist <- lst(n1 = tibble(Day = 1:10, text = letters[1:10]),
                   n2 = tibble(Day = 11:20, text = letters[1:10]))

需求

提取嵌套列表中每个tibble的Day列最大值,要求用purrr的map系列函数实现,且方案具备通用性,可适配其他函数。

问题重现

尝试了以下代码:

examplelist %>% map_depth(1, "Day", max)
# 以及
map(examplelist, ~.[["Day"]], max)

但返回的是每个tibble的Day列全部值,而非最大值:

$n1
[1]  1  2  3  4  5  6  7  8  9 10

$n2
[1] 11 12 13 14 15 16 17 18 19 20

期望得到结果为10和20。

正确解决方案

方法1:匿名函数配合map_dbl

这是最直观的写法,清晰表达“提取列→应用函数”的逻辑:

map_dbl(examplelist, ~ max(.[["Day"]]))

输出结果:

n1 n2 
10 20 

方法2:map_depth嵌套调用

如果想保留map_depth的使用,可以针对tibble内部的列指定深度:

map_dbl(examplelist, map_depth, .depth = 2, "Day", max)
# 更易读的等价写法
map_dbl(examplelist, ~ map_dbl(., "Day", max))

方法3:pluck提取列后计算

pluck是purrr中专门用于提取嵌套元素的函数,语义更清晰:

map_dbl(examplelist, ~ pluck(., "Day") %>% max())

原理与通用性说明

原有代码问题

  • map_depth(1, "Day", max):map_depth(1)作用于第一层的tibble,传入字符串"Day"时,函数会直接提取该列,第三个参数max并未被应用到提取后的列上,因为此时"Day"被当作了提取索引而非函数参数。
  • map(examplelist, ~.[["Day"]], max):这里的max是map的.default参数(用于处理不存在的元素),不是作用于Day列的函数,所以只会返回提取的列数据。

通用扩展

只需替换max为其他函数,即可适配不同计算需求:

# 计算Day列最小值
map_dbl(examplelist, ~ min(.[["Day"]]))
# 计算Day列均值
map_dbl(examplelist, ~ mean(.[["Day"]]))
# 同时计算最大、最小值并返回列表
map(examplelist, ~ list(max_day = max(.[["Day"]]), min_day = min(.[["Day"]])))

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.14 06:47:33