In R, quando si lavora con i vettori, le persone spesso preferiscono lavorare sull'intero vettore in una volta invece di eseguirne il ciclo (vedere, ad esempio, la discussione this).
In un certo senso, R ha un filtro "incorporato" e riduce le funzioni: il modo in cui è possibile selezionare sottoinsiemi di un vettore. Sono molto utili in R, e ci sono alcuni modi per farlo - Ti mostrerò un paio, ma ne raccoglierai di più se leggi di R e guardi il codice di altre persone su un sito come questo. Vorrei anche considerare lo ?which
e lo ?'['
, che ha più esempi di quelli che faccio qui.
Il primo modo è semplicemente selezionare quali elementi si desidera.È possibile utilizzare questo se si conoscono gli indici degli elementi che si desidera:
x <- letters[1:10]
> x
[1] "a" "b" "c" "d" "e" "f" "g" "h" "i" "j"
Se vogliamo solo le prime cinque lettere, possiamo scrivere:
x[1:5]
x[c(1,2,3,4,5)] # a more explicit version of the above
È inoltre possibile selezionare quali elementi vi non desiderato utilizzando un segno meno, per esempio:
x[-(6:10)]
un altro modo per selezionare gli elementi è quello di utilizzare un vettore booleano:
x <- 1:5
selection <- c(FALSE, TRUE, FALSE, TRUE, FALSE)
x[selection] # only the second and fourth elements will remain
Questo è importante perché possiamo creare un tale vettore mettendo un vettore in una funzione di confronto:
selection <- (x > 3)
> selection
[1] FALSE FALSE FALSE TRUE TRUE
x[selection] # select all elements of x greater than 3
x[x > 3] # a shorthand version of the above
Ancora una volta, si può scegliere l'opposto del confronto usiamo (si noti che poiché è booleano, usiamo !
e non -
):
x[!(x > 3)] # select all elements less than or equal to 3
Se si vuole fare paragoni vettore, si dovrebbe prendere in considerazione la funzione %in%
. Ad esempio:
x <- letters[1:10]
> x %in% c("d", "p", "e", "f", "y")
[1] FALSE FALSE FALSE TRUE TRUE TRUE FALSE FALSE FALSE FALSE
# Select all elements of x that are also "d", "p", "e", "f", or "y"
x[x %in% c("d", "p", "e", "f", "y")]
# And to select everything not in that vector:
x[!(x %in% c("d", "p", "e", "f", "y"))]
Quanto sopra sono solo alcuni esempi; Raccomanderò sicuramente la documentazione. So che questo è un lungo post dopo che hai già accettato una risposta, ma questo genere di cose è molto importante e capire che ti farà risparmiare molto tempo e dolore in futuro se sarai nuovo a R, quindi ho pensato Condividerei un paio di modi per farlo con te.
In questo caso potrebbe essere ancora più breve, non hai davvero bisogno di '== 1' poiché' %% 'restituirà solo 0 e 1. Usa 'sum (x %% 2)'. Questo potrebbe anche essere un po 'più veloce dal momento che non stai generando logici e li converti in numeri. Alcuni potrebbero trovare la versione più lunga più leggibile (e se si dovesse espandere questo alla ricerca di numeri che sono o non sono multipli di qualcosa di diverso da 2 allora sarebbe necessaria la versione più lunga. –