假设我有这个向量c("a", "b", "c")
和以下数据框:
a d t g h
r a b c
a b c
m p o a b t
c t b a
a b c t g
我的矢量总是长度为3,每个数据帧行的长度可以是3到6列。如何检查我的向量是否是data.frame行的一部分,而不是遍历每行的每个元素?
对于我给出的示例,预期输出将是:
FALSE
TRUE
TRUE
FALSE
FALSE
TRUE
答案 0 :(得分:5)
只需为每行创建一个字符串,然后使用grepl
。
# My version of your data
check_values <- c("a", "b", "c")
my_data <- structure(list(V1 = c("a", "r", "a", "m", "c", "a"), V2 = c("d",
"a", "b", "p", "t", "b"), V3 = c("t", "b", "c", "o", "b", "c"
), V4 = c("g", "c", NA, "a", "a", "t"), V5 = c("h", NA, NA, "b",
NA, "g"), V6 = c(NA, NA, NA, "t", NA, NA)), .Names = c("V1",
"V2", "V3", "V4", "V5", "V6"), row.names = c(NA, -6L), class = "data.frame")
# Actual solution
row_strings <- do.call(paste0, my_data)
check_string <- paste0(check_values, collapse = "")
grepl(check_string, row_strings, fixed = TRUE)
# [1] FALSE TRUE TRUE FALSE FALSE TRUE
答案 1 :(得分:2)
我遇到了同样的问题,我记得@akrun发布了一个对我的问题非常有帮助的答案。我试图找到原来的答案,但没有运气;这是参考他的回答的方法:
do.call(paste0, df) %in%
do.call(paste0, df[apply(df, 1, function(x) all(diff(match(vec, x))>0)),])
# [1] FALSE TRUE TRUE FALSE FALSE TRUE
答案 2 :(得分:1)
可以使用apply
和stringr::detect
作为
library(stringr)
apply(df, 1, function(x)str_detect(paste(x, collapse=""), paste(v, collapse="")))
#[1] FALSE TRUE TRUE FALSE FALSE TRUE
注意:可以使用grepl
代替str_detect
。