在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
相关产品推荐
相关产品推荐

