Есть ли способ векторизовать этот цикл foreach в R, чтобы сделать замену текста более эффективной? - PullRequest
0 голосов
/ 25 апреля 2018

Рад присуждать баллы за ответы кому-то, кто может помочь мне векторизовать этот процесс. Я хотел бы найти, чтобы увидеть, если в строке отсутствует название города, и указать при этом отсутствующее название города.действительно отсутствует.

Предположим, у меня есть такие данные:

df <- data.frame(X=c(1:5), Houston.Addresses=c("548 w 19th st", "6611 Portwest Dr. #190, houston, tx", "3555 Timmons Ln Ste 300, Houston, TX, 77027-6466", "3321 Westpark Dr", "16221 north freeway"))

Я хотел бы получить такие данные:

df.desired <- data.frame(X=c(1:5), Houston.Addresses=c("548 w 19th st, houston, tx", "6611 Portwest Dr. #190, houston, tx", "3555 Timmons Ln Ste 300, Houston, TX, 77027-6466", "3321 Westpark Dr, houston, tx", "16221 north freeway, houston, tx"))

Мой текущий метод очень неэффективен для больших наборов данных, яЯ уверен, что есть векторизация.Может ли кто-нибудь помочь с векторизацией этого цикла?:

foreach(i=1:nrow(df))%do%{
  t <- tolower(df[i,"Houston.Addresses"])
  x <- grepl("houston", t)
  if(!isTRUE(x)){
    df[i, "Houston.Addresses" ] <- 
      paste0(df[i, "Houston.Addresses" ], ", houston, tx")
    }
}

Заранее спасибо!

Ответы [ 2 ]

0 голосов
/ 25 апреля 2018

Еще одно предложение с использованием ifelse

df$Houston.Addresses <- ifelse(grepl("houston", df$Houston.Addresses, ignore.case=TRUE), 
    paste0(df$Houston.Addresses, ", Houston, TX"), 
    df$Houston.Addresses)
0 голосов
/ 25 апреля 2018

Вместо того, чтобы проходить через каждую строку, мы создаем логический индекс с grep (который равен vectorized), а затем присваиваем элементы 'Houston.Addresses', которые соответствуют индексу 'i1' (после преобразования в character класс) путем paste подстроки

i1 <- !grepl("houston", tolower(df$Houston.Addresses))
df$Houston.Addresses <- as.character(df$Houston.Addresses)
df$Houston.Addresses[i1] <- paste0(df$Houston.Addresses[i1], ", houston, tx")

Если бы мы хотели сделать его более эффективным, мы могли бы использовать data.table для выполнения задания (:=)

library(data.table)
setDT(df)[, Houston.Addresses := as.character(Houston.Addresses)
            ][!grepl("houston", tolower(Houston.Addresses)),
                 Houston.Addresses := paste0(Houston.Addresses, ", houston, tx")]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...