【发布时间】:2016-09-13 16:24:51
【问题描述】:
我在编写一些 R 代码时遇到了一些死胡同,我想也许你会知道如何使整个事情变得可行,因为可以提高效率。
所以,我想做的是以下几点:
我有一个大约 700 万个观测值的推文数据集。目前,我对推文的文本或任何其他元数据不感兴趣,而只对“位置”字段感兴趣,因此我已将该数据提取到一个新的 data.frame 中,其中包含位置变量(字符串)和一个新的当前为空的“isRelevant”变量(逻辑)。此外,我有一个包含格式如下的文本信息的向量: "Placename(1)|Placename(2)[...]|Placename(i)" 。我要做的是grepl 位置变量的每一行,以查看是否与 Placenames 向量匹配,如果是,则在 isRelevant 变量中返回“TRUE”并返回“FALSE”如果不是。
为此,我编写了一些 R 代码,基本上可以归结为这一行:
locations.df$isRelevant <- sapply(locations.df$locations, function(s) grepl(grep_places, s, ignore.case = TRUE))
其中grep_places 是由“|”分隔的可能匹配项的列表字符,让 R 知道它可以匹配向量中的任何元素。我在远程大容量计算机上运行它,它使用 RStudio (R 3.2.0) 提供超过 2 TB 的 RAM,并且我正在使用为我提供进度条的“pbsapply”运行它。事实证明,这需要 非常长的时间。到目前为止,它已经完成了大约 45%(我是在一个多星期前开始的),据说它仍然需要 270 多个小时才能完成。这显然不是一个真正可行的情况,因为将来我将不得不使用更大的数据集运行类似的代码。您知道我如何在更可接受的时间范围内完成这项工作吗,比如一天或类似的时间(请记住超级强大的计算机)。
编辑
以下是一些半模拟数据,表明我正在使用的数据大致如下:
print(grep_places)
> grep_places
"Acworth NH|Albany NH|Alexandria NH|Allenstown NH|Alstead NH|Alton NH|Amherst NH|Andover NH|Antrim NH|Ashland NH|Atkinson NH|Auburn NH|Barnstead NH|Barrington NH|Bartlett NH|Bath NH|Bedford NH|Belmont NH|Bennington NH|Benton NH|Berlin NH|Bethlehem NH|Boscawen NH|Bow NH|Bradford NH|Brentwood NH|Bridgewater NH|Bristol NH|Brookfield NH|Brookline NH|Campton NH|Canaan NH|Candia NH|Canterbury NH|Carroll NH|CenterHarbor NH|Charlestown NH|Chatham NH|Chester NH|Chesterfield NH|Chichester NH|Claremont NH|Clarksville NH|Colebrook NH|Columbia NH|Concord NH|Conway NH|Cornish NH|Croydon NH|Dalton NH|Danbury NH|Danville NH|Deerfield NH|Deering NH|Derry NH|Dorchester NH|Dover NH|Dublin NH|Dummer NH|Dunbarton NH|Durham NH|EastKingston NH|Easton NH|Eaton NH|Effingham NH|Ellsworth NH|Enfield NH|Epping NH|Epsom NH|Errol NH|Exeter NH|Farmington NH|Fitzwilliam NH|Francestown NH|Franconia NH|Franklin NH|Freedom NH|Fremont NH|Gilford NH|Gilmanton NH|Gilsum NH|Goffstown NH|Gorham NH|Goshen NH|Grafton NH|Grantham NH|Greenfield NH|Greenland NH|Greenville NH|Groton NH|Hampstead NH|Hampton NH|HamptonFalls NH|Hancock NH|Hanover NH|Harrisville NH|Hart'sLocation NH|Haverhill NH|Hebron NH|Henniker NH|Hill NH|Hillsborough NH|Hinsdale NH|Holderness NH|Hollis NH|Hooksett NH|Hopkinton NH|Hudson NH|Jackson NH|Jaffrey NH|Jefferson NH|Keene NH|Kensington NH|Kingston NH|Laconia NH|Lancaster NH|Landaff NH|Langdon NH|Lebanon NH|Lee NH|Lempster NH|Lincoln NH|Lisbon NH|Litchfield NH|Littleton NH|Londonderry NH|Loudon NH|Lyman NH|Lyme NH|Lyndeborough NH|Madbury NH|Madison NH|Manchester NH|Marlborough NH|Marlow NH|Mason NH|Meredith NH|Merrimack NH|Middleton NH|Milan NH|Milford NH|Milton NH|Monroe NH|MontVernon NH|Moultonborough NH|Nashua NH|Nelson NH|NewBoston NH|NewCastle NH|NewDurham NH|NewHampton NH|NewIpswich NH|NewLondon NH|Newbury NH|Newfields NH|Newington NH|Newmarket NH|Newport NH|Newton NH|NorthHampton NH|Northfield NH|Northumberland NH|Northwood NH|Nottingham NH|Orange NH|Orford NH|Ossipee NH|Pelham NH|Pembroke NH|Peterborough NH|Piermont NH|Pittsburg NH|Pittsfield NH|Plainfield NH|Plaistow NH|Plymouth NH|Portsmouth NH|Randolph NH|Raymond NH|Richmond NH|Rindge NH|Rochester NH|Rollinsford NH|Roxbury NH|Rumney NH|Rye NH|Salem NH|Salisbury NH|Sanbornton NH|Sandown NH|Sandwich NH|Seabrook NH|Sharon NH|Shelburne NH"
head(location.df, n=20)
> location isRelevant
1 London NA
2 Orleans village VT USA NA
3 The World NA
4 D M V Towson NA
5 Playa del Sol Solidaridad NA
6 Beautiful Downtown Burbank NA
7 <NA> NA
8 US NA
9 Gaithersburg Md NA
10 <NA> NA
11 California NA
12 Indy NA
13 Florida NA
14 exsnaveen com NA
15 Houston TX NA
16 Tweaking NA
17 Phoenix AZ NA
18 Malibu Ca USA NA
19 Hermosa Beach CA NA
20 California USA NA
在此先感谢大家,我非常感谢您对此的任何帮助。
【问题讨论】:
-
这是一个合理的问题,但如果您提供一些(模拟)数据来提供reproducible example ...
-
嗨,本。很抱歉遗漏了。我现在添加了一些数据。干杯!
-
stringi包中的一些函数可能比其他正则表达式函数表现更好。 -
大家好。感谢您的快速回复。我只是在云计算系统的另一个节点上重新读取数据,然后我会将数据分成更小、更易于管理的位,然后尝试您的所有建议。我会告诉你进展如何。
-
如果您已经将
|添加到正则表达式中,为什么还要使用sapply?这个正则表达式的整个想法是为了避免sapply。要么使用sapply和fixed = TRUE组合,要么使用不带sapply的正则表达式。