如何将返回数值与ggplot的函数结果拆分至数据框独立列
解决方案
核心问题
你的函数返回的是无命名列表,导致后续拆分时无法对应到明确列名;同时unnest()默认将列表元素拆分为行而非列,这就是无法得到宽格式的原因。
方法1:修改函数返回命名列表(推荐)
先让函数返回带有明确名称的列表,后续处理更直观:
model.ARIMA.RF.fct <- function(l.obs.pomin) { # ... 你的原有计算代码 # 给列表元素命名 wynik.lst <- list(odchylka.sr = odchylka.sr, ggpl = ggpl) return(wynik.lst) }
然后用unnest_wider()直接将列表列拆分为多列:
ARIMA.RF.cwu.wyniki <- data.frame( l.obs.pomin = c(52, 69, 136, 217) ) %>% mutate( out = pmap(list(l.obs.pomin), model.ARIMA.RF.fct) ) %>% unnest_wider(out)
执行后会生成l.obs.pomin、odchylka.sr、ggpl三列,完全符合需求。
方法2:不修改原函数,直接通过索引提取
如果不想改动原有函数,可以利用列表索引手动提取元素:
ARIMA.RF.cwu.wyniki <- data.frame( l.obs.pomin = c(52, 69, 136, 217) ) %>% mutate( out = pmap(list(l.obs.pomin), model.ARIMA.RF.fct), # 提取列表第一个元素(数值),用map_dbl保证输出为数值列 odchylka.sr = map_dbl(out, 1), # 提取列表第二个元素(ggplot对象),用map保留对象类型 ggpl = map(out, 2) ) %>% select(l.obs.pomin, odchylka.sr, ggpl, -out) # 调整列顺序并移除原始out列
关键说明
unnest()是将列表的每个元素拆分为行,适合处理包含多行数据的列表;而unnest_wider()是将列表的每个元素拆分为列,正好匹配你需要的宽格式输出。- 给返回列表命名能避免依赖索引的脆弱性(比如后续函数返回元素顺序变化时会出错)。
内容的提问来源于stack exchange,提问作者GrBa
相关产品推荐
相关产品推荐

