用R中的数据帧的每一行替换另一个字符串的子字符串

时间:2018-04-27 12:34:22

标签: r lapply gsub

我有一个数据框,对于每一行,我想用A列中的值替换A列中的常规参数。

我可以用循环做到这一点,但我无法弄清楚如何用lapply更快地做到这一点。

column A            column B
hotels in {d}       London
{d} city breaks     Bangkok
cheap hotels {d}    New York

我希望结果是:

Column A
hotels in London
Bangkok city breaks
cheap hotels New York

我可以用这样的循环来做到这一点:

for (i in 1:nrow(df){
  df$Column A[i] <- gsub("\\{d\\}",df$Column B[i], dfColumn A[i])
}

但对于数百万行,这会很慢..

3 个答案:

答案 0 :(得分:4)

您可以使用stringr在一行中进行操作,这是向量化的...

library(stringr)
df$columnA <- str_replace(df$columnA, "\\{d\\}", df$columnB)

df
                columnA  columnB
1      hotels in London   London
2   Bangkok city breaks  Bangkok
3 cheap hotels New York New York

答案 1 :(得分:2)

这是一个没有循环的基本R方法 首先,读入数据。请注意,我已经更改了列的名称。

df <- read.table(text = "
column.A            column.B
'hotels in {d}'       'London'
'{d} city breaks'     'Bangkok'
'cheap hotels {d}'    'New York'
", header = TRUE, stringsAsFactors = FALSE)

df2 <- df    # make a copy for results comparison

# your code
for (i in 1:nrow(df)){
  df$column.A[i] <- gsub("\\{d\\}",df$column.B[i], df$column.A[i])
}

regmatches(df2$column.A, regexpr("\\{d\\}", df2$column.A)) <- df2$column.B
df2
#               column.A column.B
#1      hotels in London   London
#2   Bangkok city breaks  Bangkok
#3 cheap hotels New York New York


identical(df, df2)
#[1] TRUE

答案 2 :(得分:0)

以下是valueOf的版本:

apply