在R语言中如何用lapply替代循环批量替换数据框行内子串
用向量化方法替代循环实现逐行参数替换
嘿,我明白你想摆脱循环,用更高效的方式完成这个替换任务!其实R里有不少比循环和基础lapply更简洁高效的向量化方法,我来一步步给你演示:
首先构造示例数据框
先把你提到的示例数据用代码还原出来,方便测试:
df <- data.frame( A = c("hotels in {d}", "{d} city breaks", "cheap hotels {d}"), B = c("London", "Bangkok", "New York"), stringsAsFactors = FALSE )
方法1:用lapply实现(满足你的需求)
如果一定要用lapply,可以遍历每一行的索引,完成替换后再把结果转为向量赋值回去:
df$A <- lapply(1:nrow(df), function(i) { gsub("\\{d\\}", df$B[i], df$A[i]) }) %>% unlist()
这里unlist()是把lapply返回的列表转为向量,这样才能正确赋值给数据框的列。
方法2:更推荐的mapply(多变量向量化)
其实mapply更适合这种逐对处理两个向量的场景,它会自动把df$A和df$B的对应元素配对传入函数,代码更简洁:
df$A <- mapply(function(text, replacement) { gsub("\\{d\\}", replacement, text) }, df$A, df$B)
方法3:用stringr包的向量化替换(最简洁)
如果你习惯用tidyverse工具链,stringr包的str_replace天生支持向量化替换,一行就能搞定:
library(stringr) df$A <- str_replace(df$A, "\\{d\\}", df$B)
验证结果
不管用哪种方法,最终df$A都会变成你想要的结果:
> df$A [1] "hotels in London" "Bangkok city breaks" "cheap hotels New York"
这些向量化方法比循环高效得多,尤其是当你的数据框有几万甚至几十万行的时候,性能差距会非常明显。
内容的提问来源于stack exchange,提问作者Tim496
相关产品推荐
相关产品推荐

