在R中搜索多个文本模式

时间:2014-09-12 03:25:13

标签: r

此问题与:Searching a data.frame in R

有关

我想搜索多种模式,例如<美国'和'联合',在

  1. 所有字段
  2. 在给定的字段中
  3. 如何做到这一点?案件需要忽略。

    数据:

    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行(即不同的搜索字符串可以位于不同的列中)。

3 个答案:

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