如何用purrr替代for循环递归调用tidyr::separate_longer_delim处理数据框
用purrr::reduce替代循环实现多列递归拆分
首先给出原始数据框:
dat <- data.frame( plotType = c("RP", "FP"), turbType = c("3;8", "5;7"), turbSize = c(2.4, "3.6;4.2"), estimate = c(0.1, 0.5) )
需要处理的目标列:
strat <- c('turbType', 'turbSize')
原有的for循环实现方式:
for(i in seq(length(strat))) { dat <- tidyr::separate_longer_delim(dat, dplyr::all_of(strat[i]), delim = ";") }
purrr::reduce解决方案
可以用purrr::reduce来迭代处理每一列,把数据框作为初始值,依次传入每个列名执行拆分操作,代码如下:
library(purrr) library(tidyr) library(dplyr) result <- reduce(strat, ~ separate_longer_delim(.x, all_of(.y), delim = ";"), .init = dat)
代码解释
reduce的第一个参数是要迭代的列名向量strat- 第二个参数是匿名函数:
.x代表每次迭代后的结果数据框,.y代表当前迭代的列名 .init指定初始输入数据框为dat- 每次迭代都会把上一步处理好的数据框,对当前列执行
separate_longer_delim拆分,最终得到和for循环完全一致的结果
验证结果:
print(result) # plotType turbType turbSize estimate # 1 RP 3 2.4 0.1 # 2 RP 8 2.4 0.1 # 3 FP 5 3.6 0.5 # 4 FP 5 4.2 0.5 # 5 FP 7 3.6 0.5 # 6 FP 7 4.2 0.5
内容的提问来源于stack exchange,提问作者user1658170
相关产品推荐
相关产品推荐

