如何用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
相关产品推荐
相关产品推荐

