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

在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 09:04:29