2015-05-11 21 views
7

如何將tapply命令與'not in'邏輯相結合?將tapply和'not in'邏輯相結合,使用R

目標:獲得每個物種的萼片長度的中位數。

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

約束:刪除針對其存在的1.3和1.5的花瓣寬度條目。

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

嘗試

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

結果:閉合錯誤消息 '類型的對象 '' 不是subsettable'。

---

我嘗試在這裏與虹膜數據集是我自己的數據集替身演示。我試圖用我自己的數據集採用相同的方法,並收到相同的錯誤消息。我想象我的語法有些問題。它是什麼?

+0

'median [!iris $ Petal.Width%in%c('1.3','1.5')]' 您在這裏對函數進行子集化。這產生了一個錯誤。你不能在函數上使用[]。 – maRtin

回答

9

嘗試

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 

這裏的想法是要擺在首位的子集TED中的數據進行操作。

您的線路不工作,因爲FUN參數應該應用於XSepal.Length在您的情況)而不是整個數據集。

1

這是解決辦法,你應該做:如果你用這種方式分裂矢量後子集

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

事情變得醜陋。您有效不得不

  • 再次分裂它(使用1:nrow(iris) %in% i時)和
  • (使用!(iris$Petal.Width %in% c('1.3', '1.5'))時)計算的子集一次的iris$Species每個值。