仅当2个变量的观测值在R中彼此匹配时,子集数据

时间:2019-04-02 20:02:36

标签: r if-statement conditional subset

我有这样的数据:

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

如果蓝色和红色相互匹配,我想对行进行子集化,然后自己观察。

我正在尝试遵循代码,但是当我看到使用表格功能检查它们时,还有其他一些颜色与这些颜色之一匹配。

 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意外事件表分开,然后创建2 x 2意外事件表。如果还有其他建议可以这样做,将不胜感激。

谢谢!

这就是我不想要的意思。我只想保持观察结果为蓝色和红色。我不想观察到绿色,橙色,青色。

            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

3 个答案:

答案 0 :(得分:2)

您可以添加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

答案 1 :(得分:0)

这应该有效!

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

答案 2 :(得分:0)

您可以尝试使用data.frame过滤grepl

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