结合 tapply 和 'not in' 逻辑,使用 R

Combining tapply and 'not in' logic, using R

如何将 tapply 命令与 'not in' 逻辑结合起来?

Objective:获取每个物种的萼片长度中值。

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

结果:错误消息“'closure' 类型的对象不可子集化”。

---

我在这里对 iris 数据集的尝试是我自己的数据集的替代演示。我对自己的数据集尝试了相同的方法并收到了相同的错误消息。我想我的语法有问题。它是什么?

尝试

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 

这里的想法是首先对子集数据进行操作。

您的行不起作用,因为 FUN 参数应应用于 X(在您的情况下为 Sepal.Length)而不是整个数据集。

这是您应该的解决方法:

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$Species 的每个值计算一次子集(使用 !(iris$Petal.Width %in% c('1.3', '1.5')) 时)。