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

在R中如何将函数映射到tibble每一行?报错排查求助

问题分析与修正方案

错误原因

你在执行mutate(temp = map(list(name, qty, price, add), sample_func))时犯了核心错误:list(name, qty, price, add)会把当前行的四个列拆成四个独立的原子向量(比如第一行就是"CHR1"、15、222.14、6这四个单个值),map会逐个把这些单个值传给sample_func。但你的sample_func是接收一个包含name/qty等字段的tibble/列表,用tib$name去取字段,传入单个原子向量时自然会触发$ operator is invalid for atomic vectors错误。

修正方案

方案1:修改函数参数,用pmap映射行数据

调整sample_func接收单独的字段参数,再用pmap直接将每一行的多列对应传递给函数:

# 调整函数为接收单独参数
sample_func <- function(name, qty, price, add){
    e <- qty + price + add
    tibble(e = e, stock = name)
}

# 用pmap映射每一行的四个列
result <- tib %>% 
    pmap(sample_func)

方案2:保留原函数,传递整行数据

如果不想修改sample_func,可以把每一行打包成一个tibble后再传递:

# 保持原sample_func不变
result <- tib %>% 
    rowwise() %>% 
    transmute(temp = sample_func(tibble(name, qty, price, add))) %>%
    pull(temp)  # 提取出列表,得到预期格式

验证输出

执行修正后的代码,会得到你预期的结果:

[[1]]
# A tibble: 1 × 2
      e stock
  <dbl> <chr>
1  243. CHR1 

[[2]]
# A tibble: 1 × 2
      e stock
  <dbl> <chr>
1  139. CHR2 

额外优化:简化列表转tibble的步骤

你最初将列表转换为tibble的代码可以简化为:

tib <- lst %>%
    map_dfr(~tibble(
        name = .x[1],
        qty = as.numeric(.x[2]),
        price = as.numeric(.x[3]),
        add = as.numeric(.x[4])
    ))

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.01 13:17:32