【问题标题】:Combining tapply and 'not in' logic, using R结合tapply和'不在'逻辑,使用R
【发布时间】:2015-07-22 13:36:07
【问题描述】:

如何将 tapply 命令与“不在”逻辑相结合?

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

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

结果:错误消息“‘闭包’类型的对象不是可子集的”。

---

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

【问题讨论】:

  • median[!iris$Petal.Width %in% c('1.3', '1.5')] 你在这里设置了一个函数。这会产生错误。您不能在函数上使用 [ ]。

标签: r notin tapply


【解决方案1】:

试试

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)而不是整个数据集。

【讨论】:

    【解决方案2】:

    这是你应该做的解决方法:

    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')) 时)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-01-31
      • 2015-01-28
      • 1970-01-01
      • 1970-01-01
      • 2020-08-27
      • 2020-08-19
      • 2016-10-18
      • 1970-01-01
      相关资源
      最近更新 更多