Как быстрее итерировать и тестировать столбцы фрейма данных в R? - PullRequest
0 голосов
/ 20 февраля 2019

У меня есть фрейм данных в R с 2 переменными: a и b.

Я хочу проверить строку за строкой, проверяя, содержит ли переменная a шаблон 'OK' .

Если это TRUE, я хочу инвертировать содержимое переменной a и переменной b в одной строке.

Следующий кодработает:

for(i in 1:nrow(dataframe)){
  if(!is.na(grep('OK', dataframe$a[i])[1])){
    b = dataframe$b[i]
    dataframe$b[i] <- dataframe$a[i]
    dataframe$a[i] <- b
  }
}

Я хотел бы знать, есть ли лучший способ получить тот же результат, но быстрее?

1 Ответ

0 голосов
/ 20 февраля 2019

Используя векторизованные функции в R, вы можете проверить все строки в одном вызове функции.Вы можете видеть, что мой код был в 50 раз быстрее в примере ниже.

В этом случае if_else - это векторизованная версия ifelse, а str_detect - векторизованная версия grep.Пакеты и каналы tidyverse предоставляют функции select и mutate, которые облегчают манипулирование кадрами данных с помощью векторизованных функций.

library(tidyverse)

n <- 10000
sampledata <- data.frame(aa=rbinom(n, 1, 0.5), b = rep("bvalue", n), stringsAsFactors = FALSE) %>% 
  mutate(a = if_else(aa == 0, "nothing", "OK")) %>% 
  select(a, b, -aa)

yourcode <- function(sampledata) {  
  newdata <- sampledata
  for(i in 1:nrow(sampledata)){
    if(!is.na(grep('OK', sampledata$a[i])[1])){
      b <- sampledata$b[i]
      newdata$b[i] <- sampledata$a[i]
      newdata$a[i] <- b
    }
  }
  return(newdata)
}

# using vectorized functions and tidyverse will make your code faster

mycode <- function(sampledata) {
  newdata <- sampledata %>% mutate(new_b = if_else(str_detect(a, "OK"), a, b),
                                   new_a = if_else(str_detect(a, "OK"), b, a)) %>%
    select(-a, -b, a = new_a, b = new_b)
  return(newdata)
  }

system.time(yourcode(sampledata))
#>    user  system elapsed 
#>    1.46    0.03    1.56
system.time(mycode(sampledata))
#>    user  system elapsed 
#>    0.03    0.00    0.03

Создано в 2019-02-20 с помощью Представить пакет (v0.2.1)

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