结合 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'))
时)。
如何将 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'))
时)。