R在多个数据框列中查找值

时间:2013-06-25 02:33:05

标签: r dataframe

给定一个数据集,其中值可以位于数据帧的任何一列中:

df <- data.frame(h1=c('a', 'b', 'c', 'a', 'a', 'b', 'c'), h2=c('b', 'c', 'd', 'b', 'c', 'd', 'b'), h3=c('c', 'd', 'e', 'e', 'e', 'd', 'c'))

如何获取指定哪些行包含目标值的逻辑向量?在这种情况下,搜索'b',我想要一个行(1,2,4,6,7)的逻辑向量为TRUE。

实际数据集更大更复杂,所以我试图避免使用for循环。

感谢

编辑:

这似乎有效。

>apply(df, 1, function(x) {'b' %in% as.vector(t(x))}) -> i
> i
[1]  TRUE  TRUE FALSE  TRUE FALSE  TRUE  TRUE

3 个答案:

答案 0 :(得分:8)

如果速度是一个问题,我会选择:

rowSums(df == "b") > 0

答案 1 :(得分:5)

apply(df, 1, function(r) any(r == "b"))

答案 2 :(得分:0)

我宁愿把它包装成一个小辅助函数,它也返回匹配的行并对所有列执行不区分大小写的搜索

require(dplyr)
require(stringr)

search_df = function(df, search_term){
    apply(df, 1, function(r){
        any(str_detect(as.character(r), fixed(search_term, ignore_case=T)))
    }) %>% subset(df, .)
}

search_df(iris, "Setosa")

为了使它更通用,也可以重写它以将匹配的表达式/规则公开为函数参数:

match_df = function(df, search_expr){
    filter_fun = eval(substitute(function(x){search_expr}))

    apply(df, 1, function(r) any(filter_fun(r))) %>% subset(df, .)
}

match_df(iris, str_detect(x, "setosa"))