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

问题描述 投票:0回答:1

我有一个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”和“Coal”,并创建一个子集,仅显示“Combustion”和“Coal”在同一句子中的组合或在data.frame中的任何位置相同的行:

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

燃料梳 - 发电 - 煤。

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

看截图(我没有足够的学分来附加图片)。 [截图] [1]

使用RStudio搜索显示:“Comb”的675个结果和“Coal”的251个结果。因此,如果我是正确的,最终组合应该等于或小于251。

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

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

[1]: https://i.stack.imgur.com/YJr5B.png
r grep pattern-matching subset string-matching
1个回答
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),]
© www.soinside.com 2019 - 2024. All rights reserved.