使用apply系列将col1的每一行替换为col2中的相应标记

时间:2018-01-24 22:41:00

标签: r

我觉得这必须是一个超级基本的东西要解决,但我的搜索能力让我失望。

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循环来解决此问题,但我觉得必须通过vapplysapply来实现此目的。

我的for循环解决方案如下:

for (i in 1:nrow(df)) {
     itemhold <- df$col1[i]
     df$col2[i] <- gsub("~xyz~", itemhold, df$col2[i])
}

任何提示将不胜感激。如果现在不是很明显,我对R来说相当新,这是我的第一语言。

编辑:我删除了一些关于我用于这些目的的函数的东西,因为我实际上通过我的minrep示例我意识到它不需要 - 我在特殊情况下使用该函数这在这里并不重要。

2 个答案:

答案 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