R:检查向量是否是数据帧中任何行的一部分

时间:2018-04-12 20:18:31

标签: r dataframe vector

假设我有这个向量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

3 个答案:

答案 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)

可以使用applystringr::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