仅当 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。
我有这样的数据:
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。