给定一个数据集,其中值可以位于数据帧的任何一列中:
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
答案 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"))