gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 12:08:20 26 4
gpt4 key购买 nike

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

最佳答案

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

关于r - 如果 which(x) 的长度为 0,为什么 y[-which(x)] 返回一个长度为 0 的向量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54412844/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com