2013-03-11 50 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 
    } 
}