Почему y [-which (x)] возвращает вектор длины 0, если какой (x) равен длине 0? - PullRequest
0 голосов
/ 29 января 2019
letters[-which(letters %in% c('a', 'b'))]

Возвращает cz, отбрасывая 'a' и 'b'

letters[-which(letters %in% letters)]

Возвращает символ (), как и ожидалось, вы отбрасываете весь вектор

letters[-which(letters %in% LETTERS)]

Я думаю, что это вернет буквы, но вернет символ ().Такое поведение предсказуемо, но его очень раздражает, если вы забудете об этом.Почему R делает это?Можно ли создать специальный оператор, который бы возвращал полный вектор вместо вектора длины 0?

edit: вот более сложный пример, пытающийся setdiff

df <- data.frame(letters, LETTERS, c(letters[1:13], LETTERS[14:26]), stringsAsFactors = F)
head(df)
df[-which(df[, 2] %in% df[, 3]), 1] # Retuns a-m
df[-which(df[, 1] %in% df[, 3]), 1] # Returns n-z
df[-which(df[, 2] %in% df[, 1]), 1] # Returns character()

df[which(setdiff(df[, 2], df[, 3]) %in% df[, 2]), 1] # Returns a-m
df[which(setdiff(df[, 1], df[, 3]) %in% df[, 1]), 1] # Also returns a-m
df[which(setdiff(df[, 3], df[, 1]) %in% df[, 1]), 1] # character()
df[which(setdiff(df[, 3], df[, 1]) %in% df[, 3]), 1] # a-m
df[which(setdiff(df[, 1], df[, 3]) %in% df[, 3]), 1] # character()

Ответы [ 2 ]

0 голосов
/ 29 января 2019

Почему вы думаете, что R должен вернуть letters?

-which(letters %in% LETTERS) - отрицание which(letters %in% LETTERS).Так что вы ничего не должны получить.-which(everything) равносильно ничему.Удаление letters из letters оставляет вас с пустым вектором символов.Я думаю, что результат является подходящим в этой ситуации.

Что касается кода, который может возвращать весь вектор вместо вектора нулевой длины, вы можете использовать в функции оператор if().

w <- -which(letters %in% letters)
if (!length(out <- letters[w])) letters else out 
0 голосов
/ 29 января 2019

-which(letters %in% LETTERS) возвращает integer(0), и когда вы задаете значение letters[-which(letters %in% LETTERS)], оно возвращает character(0), что логично, но да, это может раздражать, если мы не будем уделять должное внимание.

Вы можете избежать этого, используя setdiff вместо

setdiff(letters, c('a', 'b'))
#[1] "c" "d" "e" "f" "g" "h" "i" "j" "k" "l" "m" "n" "o" "p" "q" "r" "s" "t" "u" "v"
#[21] "w" "x" "y" "z"

setdiff(letters, letters)
#character(0)

setdiff(letters, LETTERS)
#[1] "a" "b" "c" "d" "e" "f" "g" "h" "i" "j" "k" "l" "m" "n" "o" "p" "q" "r" "s" "t"
#[21] "u" "v" "w" "x" "y" "z"

PS - Тем не менее, убедитесь, что у вас правильный порядок в setdiff, setdiff(x, y) не равен setdiff(y, x).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...