4

给定一个数据集,其中一个值可能位于数据框中的任何一组列中:

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
4

3 回答 3

8

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

rowSums(df == "b") > 0
于 2013-06-25T02:56:06.910 回答
5
apply(df, 1, function(r) any(r == "b"))
于 2013-06-25T02:36:20.993 回答
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"))
于 2016-11-14T10:29:10.583 回答