我有一个数据框,对于每一行,我想用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])
}
但对于数百万行,这会很慢..
答案 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