Вместо этого используйте
input3[c(FALSE,2:nrow(input3) %% 1 == 0,] <- NA
Используя 2:nrow
, вы явно указали сокращенный вектор.Когда эта вещь является логическим вектором, она должна быть длина 1 или равна количеству строк.Период.
Хотя у этого есть свои проблемы , и я не рекомендую его использовать , возможно, вы ожидали, что он будет вести себя так:
input3[which(2:nrow(input3) %% 1 == 0),] <- NA
"Хорошо" этогоявляется то, что which(...)
возвращает вектор integer
, поэтому он не должен быть такой же длины, как число строк в фрейме / таблице.
From ?Extract
(включая [
и друзья):
For '['-indexing only: 'i', 'j', '...' can be logical
vectors, indicating elements/slices to select. Such vectors
are recycled if necessary to match the corresponding extent.
'i', 'j', '...' can also be negative integers, indicating
elements/slices to leave out of the selection.
«Переработка» - это то, почему длина 1 работает: ее логическое значение используется для всех строк.Если вы используете длину 2, а количество строк четное (например, mtcars[c(T,F),]
), то это даст все остальные строки.Аналогичным образом, если вы предполагаете переработку, а количество строк не равно четному (например, mtcars[c(T,F,F),]
), ваши предположения станут менее ясными.
Добавьте к этому поведение data.table
, гдеэто не обеспечивает соблюдение этого.Переработка может привести к неприятностям, поэтому data.table
не поощряет ее.
library(data.table)
mt <- as.data.table(mtcars)
mt[c(T,F),] <- NA
# Error in `[.data.table`(x, i, which = TRUE) :
# i evaluates to a logical vector length 2 but there are 32 rows. Recycling of logical i is no longer allowed as it hides more bugs than is worth the rare convenience. Explicitly use rep(...,length=.N) if you really need to recycle.
mt[c(1,3),] <- NA