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