我觉得这必须是一个超级基本的东西要解决,但我的搜索能力让我失望。
df <- data.frame(col1 = c("abc", "def", "ghi"),
col2 = c("foo ~xyz~", "~xyz~ bar", "blah ~xyz~ blah"))
col1 col2
abc foo ~xyz~
def ~xyz~ bar
ghi blah ~xyz~ blah
我希望将gsub()
的每一行col1
放入~xyz~
中相应的col2
令牌中。所需的输出是:
col1 col2
abc foo abc
def def bar
ghi blah ghi blah
我可以使用for
循环来解决此问题,但我觉得必须通过vapply
或sapply
来实现此目的。
我的for
循环解决方案如下:
for (i in 1:nrow(df)) {
itemhold <- df$col1[i]
df$col2[i] <- gsub("~xyz~", itemhold, df$col2[i])
}
任何提示将不胜感激。如果现在不是很明显,我对R来说相当新,这是我的第一语言。
编辑:我删除了一些关于我用于这些目的的函数的东西,因为我实际上通过我的minrep示例我意识到它不需要 - 我在特殊情况下使用该函数这在这里并不重要。
答案 0 :(得分:3)
您可以使用stringr
执行此操作,而无需任何循环或apply
:
df <- data.frame(col1 = c("abc", "def", "ghi"),
col2 = c("foo ~xyz~", "~xyz~ bar", "blah ~xyz~ blah"),
stringsAsFactors = FALSE)
df$col2_replaced = str_replace(df$col2, "~xyz~", df$col1)
输出:
> df
col1 col2 col2_replaced
1 abc foo ~xyz~ foo abc
2 def ~xyz~ bar def bar
3 ghi blah ~xyz~ blah blah ghi blah
答案 1 :(得分:2)
您可以使用apply
执行此操作:
df$col2 <- apply(df, 1,
function(row) gsub(pattern="~xyz~", replacement=row["col1"], x=row["col2"]))
# col1 col2
# 1 abc foo abc
# 2 def def bar
# 3 ghi blah ghi blah
这里是mapply
(a.k.a。&#34;多变量申请&#34;)而是:
df$col2 <- mapply(
function(rep, string) gsub(pattern="~xyz~", replacement=rep, x=string),
df$col1, df$col2)
# col1 col2
# 1 abc foo abc
# 2 def def bar
# 3 ghi blah ghi blah