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()