"c" 语句可以与 "which" 语句一起使用吗?

Can the "c" statement be used along with the "which" statement?

我正在使用 R 编程语言。我很想知道“c”语句是否可以与 R 中的“which”语句一起使用。例如,考虑以下代码(var1 和 var2 都是“因子”变量):

 my_file

  var1 var2
1    A   AA
2    B   CC
3    D   CC
4    C   AA
5    A   BB

ouput <- my_file[which(my_file$var1 == c("A", "B", "C") & my_file$var2 !== c("AA", "CC")), ]

但这似乎不起作用。

我可以 运行 这些条件中的每一个,例如

output <- my_file[which(my_file$var1 == "A" | my_file$var1 == "B" | my_file$var1 == "C"), ]
output1 <- output[which(output$var2 == "AA" | output$var2 == "CC" ), ]

但我想 运行 它们以更“紧凑”的形式出现,例如:

ouput <- my_file[which(my_file$var1 == c("A", "B", "C") & my_file$var2 !== c("AA", "CC")), ]

有人可以告诉我我做错了什么吗?

谢谢

正如@deschen 在评论中所说,您应该使用 %in% 而不是 ==。您还可以 (1) 摆脱 which()(逻辑索引在这里与按位置索引一样有效)和 (2) 使用 subset 避免重新键入 my_file

output <- subset(my_file, var1 %in% c("A", "B", "C") & 
                         !(var2 %in% c("AA", "CC")))

或者,如果您喜欢 tidyverse,这将是:

library(dplyr)
output <- my_file %>% dplyr::filter(var1 %in% c("A", "B", "C"),
                           !(var2 %in% c("AA", "CC")))

filter() 中的逗号分隔条件与 & 中的逗号分隔条件相同)。

当你比较my_file$var1 == c("A", "B", "C")时,比较是逐个元素进行的,但是因为它们的长度不同,所以较短的会被重复(有警告,因为重复不完整。
c("A", "B", "D", "C", "A") == c("A", "B", "C", "A", "B") 给予: c(TRUE, TRUE, FALSE, FALSE, FALSE),然后 which 将转换为 c(1, 2)
当您一次使用一个字母时它起作用的原因是单个元素重复 5 次 my_file$var1 == "A" 导致 c("A", "B", "D", "C", "A") == c("A", "A", "A", "A", "A") 并给出您期望的结果。

@deschen 是对的,你应该使用 %in%
output <- my_file[which(my_file$var1 %in% c("A", "B", "C") & !my_file$var2 %in% c("AA", "CC")), ]