Используя векторизованные функции в 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)