2013-03-11 3 views
0

Я записываю функцию в R следующим образом, но я не мог использовать ее в векторизованном виде (вторая часть кода ниже). Мне интересно, как я могу сделать эту функцию векторизацииКак векторизовать мою функцию в R?

normalize=function(browser){ 
    if (browser=="Chrome" | browser=="Firefox" | browser=='Safari' | grepl('IE',browser)){ 
    browser 
    }else{ 
    "Others" 
    } 
} 

data$browser_n<-normalize(data$browser)  // not working (data is a data frame) 

ответ

1

Хотя это может быть не самый правильный ответ, вы можете попробовать Vectorize. В общем, вы можете использовать Vectorize для многих функций, чтобы их векторизовать. Я хотел бы добавить, что Vectorize просто красивая обертка mapply

normalize = function(browser) { 
    if (browser == "Chrome" | browser == "Firefox" | browser == "Safari" | grepl("IE", browser)) { 
     return(browser) 
    } else { 
     return("Others") 
    } 
} 

vNormalize <- Vectorize(normalize) 

data <- data.frame(browser = c("Chrome", "Firefox", "Safari", "IE 10")) 

vNormalize(data$browser) 
## [1] Chrome Firefox Safari IE 10 
## Levels: Chrome Firefox IE 10 Safari 
3

Используйте IfElse():

normalize=function(browser){ 
    ifelse(browser=="Chrome" | browser=="Firefox" | browser=='Safari' | grepl('IE',browser), browser, 'Others') 
} 

browser <- c('aaa', 'Chrome') 
normalize(browser) 
# [1] "Others" "Chrome" 
0

Или, если вы на самом деле не заинтересованы в векторизации, но хотите получить новую переменную browser_n как в ваш пример, вы могли бы просто написать

data$browser_n<-data$browser 
data$browser_n[!(data$browser=="Chrome" | data$browser=="Firefox" | 
       data$browser=='Safari' | grepl('IE',data$browser))] <- "Others" 
2
normalize <- function(browser){ 
    replace(browser, !(browser %in% c("Chrome", "Firefox", "Safari") | 
        grepl('IE',browser)), "Others") 
} 
2

Вот два комментария.

Лучше использовать || вместо |. Вот почему.

& и & & указывают на логическое И и | и || указать логическое ИЛИ. Более короткая форма выполняет элементарные сравнения во многом аналогично арифметическим операторам. Более длинная форма оценивает слева направо, исследуя только первый элемент каждого вектора. Оценка продолжается только до тех пор, пока не будет определен результат. Более длинная форма подходит для программирования потока управления и, как правило, предпочтительнее в разделах if.

Другой подход заключается в использовании any.

normalize = function(browser){ 
    if (any(browser == "Chrome", browser == "Firefox", browser == "Safari", 
    grepl("IE", browser)) { 
    browser 
    } else { 
    "Others 
    } 
} 
Смежные вопросы