使用map2比较嵌套tibble列并提取val列最大值的问题
解决嵌套Tibble中用map2提取val列最大值的问题
我懂你现在的困扰啦——想用map2处理嵌套的tibble,提取val列的最大值但代码没达到预期效果。咱们一步步来搞定这个问题:
1. 先明确示例数据(和你的结构一致)
首先我先构造一个和你描述完全匹配的示例数据集,方便后续演示:
library(tibble) library(purrr) # 构造符合你要求的嵌套tibble tbl <- tibble( ID = c("a", "b", "c"), data.x = list( tibble(val = c(1, 3), other_col = c("x", "y")), tibble(val = c(5, 2), other_col = c("m", "n")), tibble(val = c(4, 6), other_col = c("p", "q")) ), data.y = list( tibble(val = c(2, 4), other_col = c("x", "y")), tibble(val = c(6, 1), other_col = c("m", "n")), tibble(val = c(3, 7), other_col = c("p", "q")) ) )
2. 分场景给出解决方案
根据你“提取val列的最大值”的需求,分几种常见场景来处理:
场景1:提取每个ID对应的data.x中val列的最大值
用map_dbl直接从嵌套的data.x中提取最大值,结果会生成一个数值列:
tbl <- tbl %>% mutate(max_x_val = map_dbl(data.x, ~max(.x$val, na.rm = TRUE)))
场景2:提取每个ID对应的data.y中val列的最大值
和场景1逻辑一致,只是换成data.y:
tbl <- tbl %>% mutate(max_y_val = map_dbl(data.y, ~max(.x$val, na.rm = TRUE)))
场景3:提取每个ID对应的data.x和data.y的val列合并后的最大值
这时候就需要用到map2_dbl,把两个嵌套tibble的val列合并后取最大值:
tbl <- tbl %>% mutate(max_both_val = map2_dbl(data.x, data.y, ~max(c(.x$val, .y$val), na.rm = TRUE)))
场景4:比较data.x和data.y的val最大值,取两者中的较大者
如果你的需求是分别算出data.x和data.y的val最大值,再取其中更大的那个,代码可以这样写:
tbl <- tbl %>% mutate(max_compare_val = map2_dbl(data.x, data.y, ~max(max(.x$val, na.rm = TRUE), max(.y$val, na.rm = TRUE))))
3. 常见错误点排查
你之前代码出问题,大概率是这几个原因:
- 忘记加
na.rm = TRUE:如果你的val列有缺失值,max()会返回NA,加上这个参数可以忽略缺失值 - 错误访问嵌套列:比如写成
.x[val]而不是.x$val或者.x[["val"]],后者才是正确提取嵌套tibble中列的方式 - 用错map函数:如果用
map而不是map_dbl,结果会是列表列而不是数值列,不符合预期
4. 最终结果展示
运行上述代码后,你的tibble会变成这样:
# A tibble: 3 x 7 ID data.x data.y max_x_val max_y_val max_both_val max_compare_val <chr> <list> <list> <dbl> <dbl> <dbl> <dbl> 1 a <tibble [2 x 2]> <tibble [2 x 2]> 3 4 4 4 2 b <tibble [2 x 2]> <tibble [2 x 2]> 5 6 6 6 3 c <tibble [2 x 2]> <tibble [2 x 2]> 6 7 7 7
内容的提问来源于stack exchange,提问作者Hakki
相关产品推荐
相关产品推荐

