如果which(x)的长度为0,为什么y [-which(x)]返回长度为0的向量?

时间:2019-01-29 02:00:20

标签: r

letters[-which(letters %in% c('a', 'b'))]

这将返回c-z,删除“ a”和“ b”

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

这将返回character(),与预期的一样,您正在删除整个向量

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

我认为这将返回字母,但是它返回character()。这种行为是可以预见的,但是如果您忘记它,则将非常烦人。 R为什么要这样做?是否可以创建一个特殊的运算符来返回完整的向量而不是0长度的向量?

编辑:这是尝试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 :(得分:4)

ffmpeg -y -i source.mp4 -an -vf "tblend=average,framestep=2,tblend=average,framestep=2,tblend=average,framestep=2,tblend=average,framestep=2,tblend=average,framestep=2,tblend=average,framestep=2,tblend=average,framestep=2,tblend=average,framestep=2,setpts=PTS/256" -timelapse.mp4返回-which(letters %in% LETTERS),当您对那个integer(0)进行子集运算时,返回letters[-which(letters %in% LETTERS)],这是合乎逻辑的,但是可以,如果我们没有适当注意的话,可能会很烦人。

您可以改为使用character(0)来避免这种情况

setdiff

PS-但是,请确保您在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" 中具有正确的顺序,setdiff不等于setdiff(x, y)

答案 1 :(得分:0)

您为什么认为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