2015-05-11 19 views
7

Come si combina il comando maschiato con "non in" logica?Combinazione di logica fittizia e "non in", utilizzando R

Obiettivo: ottenere la lunghezza del sepalo mediano per ciascuna specie.

tapply(iris$Sepal.Length, iris$Species, median) 

Constraint: Rimuovere le voci per i quali esiste una larghezza petalo di 1.3 e 1.5.

!iris$Petal.Width %in% c('1.3', '1.5') 

Tentativo:

tapply(iris$Sepal.Length, iris$Species, median[!iris$Petal.Width %in% c('1.3', '1.5')]) 

Risultato: messaggio di errore 'oggetto di tipo 'chiusura' non è subsettable'.

---

Il mio tentativo qui con il set di dati Iris è una demo stand-in per il mio set di dati. Ho provato lo stesso approccio con il mio set di dati e ho ricevuto lo stesso messaggio di errore. Immagino che ci sia qualcosa di sbagliato nella mia sintassi. Che cos'è?

+0

'mediano [! Iris $ Petal.Width% in% c ('1.3', '1.5')]' qui si imposta una funzione. Questo produce un errore. Non puoi usare [] sulle funzioni. – maRtin

risposta

9

Prova

with(iris[!iris$Petal.Width %in% c('1.3', '1.5'),], tapply(Sepal.Length, Species, median)) 
# setosa versicolor virginica 
# 5.0  5.8  6.5 

L'idea è quella di operare sui dati sottoinsieme-ted in primo luogo.

La linea non ha funzionato perché l'argomento FUN deve essere applicato su X (Sepal.Length nel tuo caso) piuttosto su tutto il set di dati.

1

Questa è la soluzione si dovrebbe non fare:

tapply(
    1:nrow(iris), 
    iris$Species, 
    function(i) median(iris$Sepal.Length[ 
    (1:nrow(iris) %in% i) & 
    !(iris$Petal.Width %in% c('1.3', '1.5')) 
])) 

Le cose si mettono male se in subset dopo aver diviso il vettore in questo modo. Bisogna in modo efficace per

  • dividere di nuovo (quando si utilizza 1:nrow(iris) %in% i) e
  • calcolare il sottoinsieme una volta per ogni valore di iris$Species (quando si utilizza !(iris$Petal.Width %in% c('1.3', '1.5'))).
Problemi correlati