此问题与:Searching a data.frame in R
有关我想搜索多种模式,例如<美国'和'联合',在
如何做到这一点?案件需要忽略。
数据:
ddf
id country area
1 1 United States of America North America
2 2 United Kingdom Europe
3 3 United Arab Emirates Arab
4 4 Saudi Arabia Arab
5 5 Brazil South America
ddf = structure(list(id = 1:5, country = c("United States of America",
"United Kingdom", "United Arab Emirates", "Saudi Arabia", "Brazil"
), area = c("North America", "Europe", "Arab", "Arab", "South America"
)), .Names = c("id", "country", "area"), class = "data.frame", row.names = c(NA,
-5L))
编辑:为了澄清,我必须使用AND而不是OR进行搜索。在此示例中,只应出现“美利坚合众国”(第1行)。如果我搜索“巴西”和“美国”,则应该出现第5行(即不同的搜索字符串可以位于不同的列中)。
答案 0 :(得分:3)
对于“巴西”而言,这实际上是失败的。 “美国”案例,但它是诊断逻辑问题的有用试验台;
hasAm <- sapply( ddf, grepl, patt="america", ignore.case=TRUE)
ddf[ rowSums(hasAm) > 0 , ]
#----------
id country area
1 1 United States of America North America
5 5 Brazil South America
#---------
hasUn <- sapply( ddf, grepl, patt="united", ignore.case=TRUE)
#---------
ddf[ rowSums( hasAm & hasUn) > 0 , ]
#-----------
id country area
1 1 United States of America North America
此编辑版本概括了该策略,但需要输入选择标准作为公式。我需要首先折叠每个矩阵,以便在cbind() - ed值之间求和不能在单个术语上获得多次命中。所以我有两个rowSums,外面的一个是在 m - 列矩阵上完成的,其中 m 是公式中的术语数,而内部一个是在 n - 列矩阵,其中 n 是data-argument中的列数:
dfsel <- function(form, data) {
vars = all.vars(form)
selmatx <- lapply( vars, function(v)
sapply (data, grepl, patt=v, ignore.case=TRUE))
data[ rowSums( do.call(cbind,
lapply(selmatx,
function(L) {rowSums(L) > 0}) ) ) == length(vars)
, ] }
演示:
> res <- dfsel( ~ united + america , ddf)
> res
id country area
1 1 United States of America North America
> res <- dfsel( ~ brazil + america , ddf)
> res
id country area
5 5 Brazil South America
答案 1 :(得分:1)
解决它的愚蠢方式。对其他答案感兴趣。
pattern<-c('America','United')
ddf1<-NULL
for (i in 1:length(pattern)){
new<-ddf[grep(paste0(pattern[i]),ddf$country),]
ddf1<-rbind(ddf1,new)
}
答案 2 :(得分:1)
坚持世界上没有一个国家拥有的逻辑&#34;美国&#34;之前&#34; United&#34;在它的名字,你可以做
> f <- lapply(ddf, grep, pattern = "(united)(.*)(america)", ignore.case = TRUE)
> ddf[unique(unlist(f)), ]
# id country area
# 1 1 United States of America North America