Подстановка подстроки с другой строкой для каждой строки кадра данных в R - PullRequest
0 голосов
/ 27 апреля 2018

У меня есть датафрейм, и для каждой строки я хочу заменить обычный параметр в столбце A значением в столбце B.

Я могу сделать это с помощью циклов, но я не могу понять, как я мог бы сделать это быстрее с помощью 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 голосов
/ 27 апреля 2018

Вы можете сделать это в одну строку с 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
0 голосов
/ 27 апреля 2018

Вот базовый подход 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
0 голосов
/ 27 апреля 2018

Вот версия с apply:

a<-c("{d} rises in the east", "{d} has come")
b <- c("the sun", "morning")

df <- data.frame(a = a, b = b)
df
#>                       a       b
#> 1 {d} rises in the east the sun
#> 2          {d} has come morning

df$a <- apply(df, 1, function(row) {gsub("\\{d\\}", row[2], row[1])})
df
#>                           a       b
#> 1 the sun rises in the east the sun
#> 2          morning has come morning
...