您可以修改`[.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