"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")), ]
我正在使用 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")), ]