【发布时间】:2016-12-29 12:01:50
【问题描述】:
我正在尝试构建一个函数 F 来替换 stings 'df' 数据框中的目标字符串 'str', 逐列逐行,根据列名作为要替换的子串, 和列值作为替换。 结果是替换字符串的字符串向量长度“rownum” 将每个字符串的 'colnum' 替换为输出。
举个例子最能说明问题:
str <- "Hi, I am name and I am age years old! - said name "
df <- data.frame(name = c('John', 'Richard','Edward'), age =c('10','26','12'))
F(str,df)
"Hi, I am John and I am 10 years old! - said John "
"Hi, I am Richard and I am 26 years old! - said Richard "
"Hi, I am Edward and I am 12 years old! - said Edward "
我已经为这个工作写了一个函数:
F <- function(str,df)
{
x <- str
for(i in names(df)){
x <- unname(mapply(gsub,i,df[[i]],x))
}
return(x)
}
它似乎有效,但我的印象是它既不高效也不优雅。
- 有没有办法避免循环?
- mapply 是必需品吗?
- 当“str”是多行文本时,F 可以工作,而不仅仅是一个 单行?
感谢您的帮助
【问题讨论】:
-
实际上,最好使用单词边界来匹配
name和age作为整个单词。 -
如果可能的话,我会使用
str <- "Hi, I am %s and I am %s years old! - said %s "; sprintf(str, df$name, df$age, df$name)。 -
您可以使用
sprintf(gsub("name|age", "%s", str), df$name, df$age, df$name)以编程方式执行此操作 -
@RomanLuštrik 我已将您的建议添加为 cw-answer。希望你不要介意。
-
@h3rm4n 我不介意。我写下的一切都是开源的。 :)