我有这样的数据:
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
答案 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