R:在整个数据框中搜索单独的单词以创建子集

时间:2018-02-07 20:09:56

标签: r grep pattern-matching subset string-matching

我有一个11717 obs的data.frame。 15个变量。见下文:

$ SCC                : Factor w/ 11717 levels "10100101","10100102",..: 1 2 3 4 5 6 7 8 9 10 ...
$ Data.Category      : Factor w/ 6 levels "Biogenic","Event",..: 6 6 6 6 6 6 6 6 6 6 ...
$ Short.Name         : Factor w/ 11238 levels "","2,4-D Salts and Esters Prod /Process Vents, 2,4-D Recovery: Filtration",..: 3283 3284 3293 3291 3290 3294 3295 3296 3292 3289 ...
$ EI.Sector          : Factor w/ 59 levels "Agriculture - Crops & Livestock Dust",..: 18 18 18 18 18 18 18 18 18 18 ...
$ Option.Group       : Factor w/ 25 levels "","C/I Kerosene",..: 1 1 1 1 1 1 1 1 1 1 ...
$ Option.Set         : Factor w/ 18 levels "","A","B","B1A",..: 1 1 1 1 1 1 1 1 1 1 ...
$ SCC.Level.One      : Factor w/ 17 levels "Brick Kilns",..: 3 3 3 3 3 3 3 3 3 3 ...
$ SCC.Level.Two      : Factor w/ 146 levels "","Agricultural Chemicals Production",..: 32 32 32 32 32 32 32 32 32 32 ...
$ SCC.Level.Three    : Factor w/ 1061 levels "","100% Biosolids (e.g., sewage sludge, manure, mixtures of these matls)",..: 88 88 156 156 156 156 156 156 156 156 ...
$ SCC.Level.Four     : Factor w/ 6084 levels "","(NH4)2 SO4 Acid Bath System and Evaporator",..: 4455 5583 4466 4458 1341 5246 5584 5983 4461 776 ...
$ Map.To             : num  NA NA NA NA NA NA NA NA NA NA ...
$ Last.Inventory.Year: int  NA NA NA NA NA NA NA NA NA NA ...
$ Created_Date       : Factor w/ 57 levels "","1/27/2000 0:00:00",..: 1 1 1 1 1 1 1 1 1 1 ...
$ Revised_Date       : Factor w/ 44 levels "","1/27/2000 0:00:00",..: 1 1 1 1 1 1 1 1 1 1 ...
$ Usage.Notes        : Factor w/ 21 levels ""," ","includes bleaching towers, washer hoods, filtrate tanks, vacuum pump exhausts",..: 1 1 1 1 1 1 1 1 1 1 ...

我正在尝试搜索" Combustion"和"煤炭"并创建一个子集,仅显示" Combustion"和"煤炭"在data.frame中的任何位置组合相同的句子或同一行:

同一句话中使用的单词示例:

  

燃料梳 - 发电 - 煤炭。

在同一行/不同列中使用的单词示例:

  

查看截图(我没有足够的信誉来附加img)。 [截图] [1]

使用RStudio搜索显示:" Comb" "煤"和251的结果因此,如果我正确的话,最终的组合应该等于或小于251。

我尝试使用grepgrepl。但是,我使用这些函数的唯一方法是在创建子集之前重复每个列的过程(例如,使用match函数)。

我发现这是一个耗时的过程。你会有更好的吗?

[1]: https://i.stack.imgur.com/YJr5B.png

1 个答案:

答案 0 :(得分:0)

我假设“同一句话”你的意思是你要搜索的单词在一列中的同一个字符串中?

如果是这样,考虑到我如何阅读您对问题的描述,我还假设您只想通过包含两个单词的行来对数据框进行子集化,无论它们是出现在同一个句子中还是出现在同一行的不同列中。在任何一种情况下,您似乎只想提取具有两个单词的那些行。

如果是这样,那么你可以这样做的一种方法是将每行的所有列连接成数据帧的每一行一个长字符串/句子,然后grepl为更长字符串中的关键字(使用一个grepl词/短语)。这对我来说很快就行了~100k行(尽管我减少了列数):

df <- data.frame(A=c("Comb","Comb Fuel","Comb",rep("None",1e5)),B=c("Fuel","Gas","None",rep("None",1e5)))
dfp <- do.call(paste,df)
df[grepl("Comb",dfp) & grepl("Fuel",dfp),]