0

次のように R で関数を記述しましたが、ベクトル化された方法で使用できませんでした (以下のコードの 2 番目の部分)。この関数をベクトル化する方法を知りたい

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) 
4

5 に答える 5

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"
于 2013-03-11T10:22:34.443 に答える
2

ここに2つのコメントがあります。

||の代わりに使用した方がよいでしょう|。これが理由です。

& と && は、論理積と | を示します。と || 論理和を示します。短い形式は、算術演算子とほぼ同じ方法で要素ごとの比較を実行します。長い形式では、左から右に評価され、各ベクトルの最初の要素のみが調べられます。評価は、結果が決定されるまでのみ続行されます。長い形式は、制御フローのプログラミングに適しており、通常は if 句で好まれます。

別のアプローチは、を使用することanyです。

 normalize = function(browser){
   if (any(browser == "Chrome", browser == "Firefox", browser == "Safari",
     grepl("IE", browser)) {
     browser
   } else {
     "Others
   }
 }
于 2013-03-11T11:34:11.927 に答える
2
normalize <- function(browser){
  replace(browser, !(browser %in% c("Chrome", "Firefox", "Safari") | 
                     grepl('IE',browser)), "Others")  
}
于 2013-03-11T10:33:24.577 に答える
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
于 2013-03-11T10:34:47.387 に答える
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"
于 2013-03-11T10:23:33.457 に答える