仅当 2 个变量的观察值在 R 中相互匹配时才对数据进行子集

subset data only if observations of 2 variables match with each other in R

我有这样的数据:

a <- c("blue", "red", "green", "blue","cyan")
b <- c("red","red","green","blue", "orange")
df <- data.frame(a,b)
df

      a      b
1  blue    red
2   red    red
3 green  green
4  blue   blue
5  cyan orange

如果蓝色和红色彼此匹配并自己观察,我正在尝试对行进行子集化。

我正在尝试使用以下代码,但当我看到使用 table 函数检查它们时,仍有一些其他颜色与其中一种颜色匹配。

 sub <- df[df$a %in% c("blue", "red" & df$b %in% c("blue","red"), ]
 table(sub$a, sub$b)

这对我来说非常棘手。仅当蓝色和红色彼此匹配并自己观看时,我如何才能告诉 R 进行子集化?

期望的输出是:

      a      b
1  blue    red
2   red    red
3  blue   blue

这样做的最终目标是通过将 5 x 5 偶然事件 table 分开来创建 2 x 2 偶然事件 table。如果有其他建议可以做到这一点,将不胜感激。

提前致谢!

这就是我不想要的意思。我只想保持观察蓝色和红色观察。我不想观察任何绿色、橙色、青色。

            Blue        Red            Green        Orange   Cyan
  Blue       28          39              32            3        1  
  Red        47         244             184           56        3
  Green      0           0               0            0         0
  Orange     0           0               0            0         0
  Cyan       0           0               0            0         0

这应该有效!

output <- df[df$a %in% c('red','blue') & df$b %in% c('red','blue'),]

您可以尝试使用 grepl:

来过滤您的 data.frame
require(tidyverse)

result <- df %>% 
  varhandle::unfactor() %>%
  filter(grepl(pattern = paste(c("red", "blue"), collapse="|"), a) |
         grepl(pattern = paste(c("red", "blue"), collapse="|"), b))

result
     a    b
1 blue  red
2  red  red
3 blue blue

table(result)
      b
a      blue red
  blue    1   1
  red     0   1

您可以添加 droplevels() 函数,如:

# here the markus solution
twobytwo <- df[which(df$a %in% c("blue", "red") & df$b %in% c("blue","red")), ]
#here the droplevels, that removes the unused level
table(droplevels(twobytwo))

         b
a      blue red
  blue    1   1
  red     0   1

更多信息here