使用purrr::map2迭代生成tibble后合并为单一数据框的解决方案问询
解决方案
方法1:直接使用map2_dfr生成合并后的tibble
purrr包提供带_dfr后缀的map变体,会自动将每次迭代返回的单行tibble按行拼接,最终直接输出完整的表格对象,不需要手动预定义列表存储结果。
修正后的可运行代码如下:
library(tidyverse) # 原始输入数据 df <- tibble( names = c("john", "charlie", "lucy"), colours = c("green", "grey", "silver") ) # 调整函数逻辑,直接返回单行tibble即可,不需要修改外部变量 funx <- function(name, colour) { coef <- runif(1, 0, 30) tibble_row( names = name, colours = colour, coefs = coef ) } # map2_dfr自动按行合并所有迭代结果,直接赋值得到目标tibble df_coefs <- map2_dfr( .x = df$names, .y = df$colours, .f = funx )
执行后df_coefs就是你需要的完整三行tibble结构。
方法2:合并已有的列表结果
如果已经通过普通map2得到了由单行tibble组成的列表,可以用list_rbind(tidyverse 1.3.0+ 推荐)或bind_rows手动合并:
# 先得到列表形式的输出 res_list <- map2(.x = df$names, .y = df$colours, .f = funx) # 合并为完整tibble df_coefs <- list_rbind(res_list)
原代码问题说明
- 函数内使用的
i变量未定义,对外部df_coefs[[i]]的赋值操作本身无法生效,你之前得到的列表输出是purrr默认返回函数最后一行执行结果的特性带来的 - 不需要在函数内部修改外部变量,map系列函数会自动收集每次迭代的返回值,只需要保证函数返回单次迭代的正确结果即可
- 普通
map2默认返回列表结构,要得到合并后的表格,要么使用带_dfr后缀的map变体,要么后续手动拼接列表元素
内容的提问来源于stack exchange,提问作者prayner
相关产品推荐
相关产品推荐

