【问题标题】:Can the "c" statement be used along with the "which" statement?“c”语句可以与“which”语句一起使用吗?
【发布时间】:2021-11-14 00:48:49
【问题描述】:

我正在使用 R 编程语言。我有兴趣看看“c”语句是否可以与 R 中的“which”语句一起使用。例如,考虑以下代码(var1 和 var2 都是“Factor”变量):

 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")), ]

谁能告诉我我做错了什么?

谢谢

【问题讨论】:

  • 使用%in% 而不是==。一种可能更简单的方法是使用dplyr 中的filter 函数,而不是长的which…
  • 但请注意NA,因为例如NA %in% "A" 提供 FALSE 而不是 NA!

标签: r data-manipulation


【解决方案1】:

当您比较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 &lt;- my_file[which(my_file$var1 %in% c("A", "B", "C") &amp; !my_file$var2 %in% c("AA", "CC")), ]

【讨论】:

    【解决方案2】:

    正如@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() 中的逗号分隔条件与&amp; 的作用相同)。

    【讨论】:

      猜你喜欢
      • 2016-10-20
      • 2015-09-21
      • 2016-01-02
      • 2012-06-24
      • 2013-05-15
      • 2011-02-08
      • 2012-07-29
      • 2019-06-17
      • 2023-03-05
      相关资源
      最近更新 更多