R语言如何遍历tibble逐行将整行数据传入自定义函数?
问题原因
你写的map_dfr直接传入tibble时,默认按列维度遍历,而非按行遍历:第一次传入函数的是长度为10的整列href向量,第二次传入的是整列text向量,完全不符合你要传单行数据的预期,因此触发x must be a string of length 1(即x必须是长度为1的字符串)的报错。
正确实现方法
选以下任意一种写法即可:
方法1:先拆分单行再映射(最贴合你原本的传参逻辑)
先把tibble拆成由单行tibble组成的列表,再走map_dfr批量处理,传入自定义函数的参数就是结构和原数据一致的整行数据:
library(tidyverse) # 或单独加载dplyr、purrr包 pagelist %>% rowwise() %>% group_split() %>% map_dfr(scrape_function)
rowwise()标记按行分组,group_split()会把原10行数据拆为10个独立的1行tibble元素组成的列表- 后续
map_dfr会依次把每个单行tibble传入scrape_function,最后自动把所有返回结果按行合并为一个tibble
方法2:用pmap系列按行映射
pmap是purrr中专门针对多列数据按行遍历的函数,如果要传整行数据可以这么写:
pagelist %>% pmap_dfr(function(...) { single_row <- tibble(...) scrape_function(single_row) })
如果你的scrape_function是直接接收href、text两个独立参数,不需要整行tibble结构,可以写得更简洁:
pagelist %>% pmap_dfr(~ scrape_function(href = .x, text = .y))
其中.x对应当前行的href列值,.y对应当前行的text列值。
内容的提问来源于stack exchange,提问作者purpletonic
相关产品推荐
相关产品推荐

