Слишком много приложений для очистки данных в R - PullRequest
1 голос
/ 02 мая 2020

Как я могу улучшить этот код?

  data$tidy <- sapply(data$tidy,function(x) {x <- gsub("one","1",x)})
  data$tidy <- sapply(data$tidy,function(x) {x <- gsub("two","2",x)})
  data$tidy <- sapply(data$tidy,function(x) {x <- gsub(“first”,"1",x)})
  data$tidy <- sapply(data$tidyfunction(x) {x <- gsub("second","2",x)})

Общая идея такова: если я найду «один» или «первый», я заменю его на 1.

Этот код работает, но я полностью уверен, что, возможно, мог быть более эффективным.

Ответы [ 2 ]

3 голосов
/ 02 мая 2020

gsub векторизовано, поэтому вам не нужно sapply здесь.

Вы можете использовать str_replace_all, передавая именованный вектор как replacement и pattern.

Использование данных @ r2evans.

a <- c('1', '2')
names(a) <- c('one|first', 'two|second')
stringr::str_replace_all(mydata$tidy, a)
#[1] "my 1 is not 2"        "2 going into 1 or 2"   "twenty five or six to four"
2 голосов
/ 02 мая 2020

Поскольку мы не знаем, как выглядит ваш data$tidy, я создам некоторые поддельные данные.

mydata <- data.frame(tidy = c("my one is not two", "two going into first or second", "twenty five or six to four"), stringsAsFactors = FALSE)
mydata
#                             tidy
# 1              my one is not two
# 2 two going into first or second
# 3     twenty five or six to four
mydata$tidy <- gsub("(one|first)", "1", gsub("(two|second)", "2", mydata$tidy))
mydata
#                         tidy
# 1              my 1 is not 2
# 2        2 going into 1 or 2
# 3 twenty five or six to four

Поскольку вы выполняете замену подстрок, ни merge, ни fuzzyjoin:: будет делать то, что вам нужно. И хотя мы можем уменьшить / объединить некоторые шаблоны, я не знаю простого способа обойти такую ​​индивидуальную спецификацию.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...