您可以修改`[.data.frame`
函数抛出与逻辑矢量索引时的警告不平均分配的行数:
`[.data.frame` <- function(x, i, j, drop = if (missing(i)) TRUE else length(cols) == 1) {
if (!missing(i) && is.logical(i) && nrow(x) %% length(i) != 0) {
warning("Indexing data frame with logical vector that doesn't evenly divide row count")
}
base::`[.data.frame`(x, i, j, drop)
}
下面是用150行虹膜数据集示范,传递长度11(应该引起预警)和15的逻辑索引向量(应该不会导致警告):
iris[c(rep(FALSE, 10), TRUE),]
# Sepal.Length Sepal.Width Petal.Length Petal.Width Species
# 11 5.4 3.7 1.5 0.2 setosa
# 22 5.1 3.7 1.5 0.4 setosa
# 33 5.2 4.1 1.5 0.1 setosa
# 44 5.0 3.5 1.6 0.6 setosa
# 55 6.5 2.8 4.6 1.5 versicolor
# 66 6.7 3.1 4.4 1.4 versicolor
# 77 6.8 2.8 4.8 1.4 versicolor
# 88 6.3 2.3 4.4 1.3 versicolor
# 99 5.1 2.5 3.0 1.1 versicolor
# 110 7.2 3.6 6.1 2.5 virginica
# 121 6.9 3.2 5.7 2.3 virginica
# 132 7.9 3.8 6.4 2.0 virginica
# 143 5.8 2.7 5.1 1.9 virginica
# Warning message:
# In `[.data.frame`(iris, c(rep(FALSE, 10), TRUE),) :
# Indexing data frame with logical vector that doesn't evenly divide number of rows
iris[c(rep(FALSE, 14), TRUE),]
# Sepal.Length Sepal.Width Petal.Length Petal.Width Species
# 15 5.8 4.0 1.2 0.2 setosa
# 30 4.7 3.2 1.6 0.2 setosa
# 45 5.1 3.8 1.9 0.4 setosa
# 60 5.2 2.7 3.9 1.4 versicolor
# 75 6.4 2.9 4.3 1.3 versicolor
# 90 5.5 2.5 4.0 1.3 versicolor
# 105 6.5 3.0 5.8 2.2 virginica
# 120 6.0 2.2 5.0 1.5 virginica
# 135 6.1 2.6 5.6 1.4 virginica
# 150 5.9 3.0 5.1 1.8 virginica
随着一段代码您提供我得到简单的'错误...未定义的列选择“。 – zero323
不,子集不检查长度是否匹配。如果是这样的话,那么在很多情况下,像“x [c(TRUE,FALSE)]”这样的再循环就可以采取其他任何价值。或者,对于这个问题,'x [TRUE]'可以获取每个值 - 这可能会以编程方式有用。 – thelatemail
@thelatemail关于回收的意图,我肯定同意'x [TRUE]'的情况,并且我看到了回收长度为(x)的除数的情况。对于非倍数的截断情况和回收,我希望对大多数用户来说通常是一种无意的行为,并且至少应该抛出警告。 @josilber用他的解决方案涵盖了这些案例。干杯。 – SuaveIncompetence