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
'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 –
Got esso. Avrei dovuto leggere la documentazione più a fondo. Grazie! –
Hai dimenticato la parte '> 0' della funzione. – MrFlick