2015-05-11 9 views
7

Jak połączyć polecenie tapply z logiką "not in"?Łączenie logiki "tapply" i "nie w" przy użyciu R

Cel: Uzyskanie średniej długości sebum dla każdego gatunku.

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

Ograniczenie: Usuń wpisy dla których nie jest to szerokość płatek od 1,3 do 1,5.

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

Próba:

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

Wynik: komunikat o błędzie 'obiekt typu 'zamknięcie' nie jest subsettable'.

---

Moja próba tutaj ze zbioru danych tęczówki jest demo stand-in dla własnego zestawu danych. Próbowałem tego samego podejścia z moim własnym zestawem danych i otrzymałem ten sam komunikat o błędzie. Wyobrażam sobie, że coś jest nie tak z moją składnią. Co to jest?

+0

'mediana [! Iris $ Petal.Width% in% c ('1.3', '1,5')]' Podsynchronizujesz tutaj funkcję. Daje to błąd. Nie możesz używać [] w funkcjach. – maRtin

Odpowiedz

9

Spróbuj

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 

Chodzi o to, aby działać na danych podzbiór-ted w pierwszej kolejności.

Twoja linia nie działała, ponieważ argument FUN powinien być stosowany w przypadku X (Sepal.Length) raczej w całym zestawie danych.

1

To obejście należy nie zrobić:

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')) 
])) 

Robi się brzydkie, jeśli podzbiór po rozcięciu wektor w ten sposób. Skutecznie trzeba

  • podzielić ją ponownie (przy użyciu 1:nrow(iris) %in% i) i
  • obliczyć podzbiór raz dla każdej wartości iris$Species (przy użyciu !(iris$Petal.Width %in% c('1.3', '1.5'))).