2015-01-23 13 views
6

Da quello che ho letto in ?match()match() contro% in operatore%

"% a%" < - la funzione (x, tabella) partita (x, tavolo, NoMatch = 0)> 0

Perché ottengo un risultato diverso utilizzando match(x, dict[["word"]], 0L)

vapply(strsplit(df$text, " "), 
    function(x) sum(dict[["score"]][match(x, dict[["word"]], 0L)]), 1) 
#[1] 2 -2 3 -2 

Versus quando si utilizza dict[["word"]] %in% x

vapply(strsplit(df$text, " "), 
     function(x) sum(dict[["score"]][dict[["word"]] %in% x]), 1) 
#[1] 2 -2 1 -1 

dati

library(dplyr) 
df <- data_frame(text = c("I love pandas", "I hate monkeys", 
          "pandas pandas pandas", "monkeys monkeys")) 
dict <- data_frame(word = c("love", "hate", "pandas", "monkeys"), 
        score = c(1,-1,1,-1)) 

Aggiornamento

Dopo la spiegazione di Richard, ora capisco il mio equivoco iniziale. L'operatore %in% restituisce un vettore logico:

> sapply(strsplit(df$text, " "), function(x) dict[["word"]] %in% x) 
     [,1] [,2] [,3] [,4] 
[1,] TRUE FALSE FALSE FALSE 
[2,] FALSE TRUE FALSE FALSE 
[3,] TRUE FALSE TRUE FALSE 
[4,] FALSE TRUE FALSE TRUE 

E match() restituisce numeri spilli:

> sapply(strsplit(df$text, " "), function(x) match(x, dict[["word"]], 0L)) 
[[1]] 
[1] 0 1 3 

[[2]] 
[1] 0 2 4 

[[3]] 
[1] 3 3 3 

[[4]] 
[1] 4 4 
+6

'match()' restituisce i numeri di posizione, che possono essere più di 1, '% in%' è un vettore logico in cui una corrispondenza (VERO) è ** sempre ** 1. Quindi, le somme possono differire –

+0

Got esso. Avrei dovuto leggere la documentazione più a fondo. Grazie! –

+2

Hai dimenticato la parte '> 0' della funzione. – MrFlick

risposta

5

match() restituisce un intero vettore di posizioni per la prima partita, che sarà maggiore 1 se tale posizione non è il primo.

%in% restituisce un vettore logico in cui una corrispondenza (VERO) è sempre 1 (se rappresentato come numero intero).

Quindi, le somme nei calcoli saranno probabilmente diverse.