如何在 R 中处理文本文件的所有元素

Posted

技术标签:

【中文标题】如何在 R 中处理文本文件的所有元素【英文标题】:How to have all elements of text file processed in R 【发布时间】:2019-08-07 11:13:57 【问题描述】:

我有一个文本文件NPFile,其中包含 100 篇不同的报纸文章,长度为 3523 行。我正在尝试为每篇文章挑选并解析不同的数据字段以进行文本处理。这些字段是:全文:出版日期:,出版标题:等......

我正在使用grep 来挑选包含我想要的数据字段的不同行。虽然我可以获得行号(字段的开始和结束位置),但当我尝试使用行号提取实际文本并将其放入向量时出现错误:

#Find full text of article, clean and store in a variable
findft<-grep ('Full text:', NPFile, ignore.case=TRUE)
endft<-grep ('Publication date:', NPFile)
ftfield<-(NPFile[findft:endft])

最后一行ftfield&lt;-(NPFile[findft:endft] 给出了这个警告信息:

1: In findft:endft : numerical expression has 100 elements: only the first used

起点findft 和终点endft 各包含100 个元素,但如警告所示,ftfield 仅包含第一个元素(长度为11 行)。我假设(错误地/错误地)将提取全文字段的每 100 个实例的相应行并将其存储在 ftfield 中 - 但显然我没有正确编码。任何帮助将不胜感激。

数据示例(这些是与文本文件中的 100 个之一关联的字段和数据):

等待500年的洪水;红河横冲直撞:恶劣天气事件,新纪录比预期更频繁。

全文:当红河在北达科他州肆虐临时堤坝以抵抗其愤怒时,将城市淹没在洪水位以上 26 英尺的水柱下,气象学家很难在人类年表中描述其规模。 一场 500 年的洪水,有人称之为灾难性天气事件,自从克里斯托弗·哥伦布到达新大陆海岸以来,这种事件只会发生一次。是否可以将其称为 700 年洪水或 300 年洪水尚有待商榷。 洪水的规模和威力是前所未有的。虽然红河以前曾蹂躏中西部上游,但法戈和大福克斯的洪峰高度几乎令人难以理解。 但是气候记录被打破的速度比以往任何时候都快。一场 100 年的风暴可能会在几年内重演,就像等待下一个世纪一样。它只是一种对严重程度进行分类的方法,而不是频率。美国国家海洋和大气管理局的气候学家汤姆卡尔说:“不再有真正的百年事件。” 美国可靠、一致的天气记录只能追溯到 150 年前左右。人类发展已经改变了地球的表面和大气,促进了比未受破坏的环境本身产生的更大的天气变化和影响。 切萨皮克湾可能发生的 500 年事件尚不确定。去年是淡水涌入海湾的记录。 1996 年 1 月流入河口的融雪洪流记录的日平均值超过了 1972 年热带风暴艾格尼丝期间的流量,这是这些地区 100 年气象事件的基准。但是,根据美国地质调查局的数据,对海湾生态系统的影响并不像 1972 年那样具有破坏性。 在过去的一个世纪里,海湾的海平面上升了近一英尺,是过去 5000 年的三倍,马里兰大学的科学家斯蒂芬莱瑟曼将其与全球气候变暖联系起来。河口岛屿和高地海岸线正在加速侵蚀。 当然,海湾流域的地形与红河的地形不同。这不仅仅是流量和降雨量,还有水的导向方式以及它可以在哪里逃逸而不会侵入太远的旱地。我们只能希望再过 500 年,切萨皮克地区才会受到如此考验。 发布日期:4/22/97

发布日期:1997 年 4 月 22 日

出版物名称:太阳;马里兰州巴尔的摩。

标题:等待500年的洪水;红河横冲直撞:恶劣天气事件,新记录比预期更频繁。:[最终版]


从上面的这个数据示例中,当我检查 ftfield 时,它有 11 行:

[1] “全文:当 RED 河在北达科他州肆虐临时搭建的堤坝以抵抗它的愤怒时,淹没了洪水位以上 26 英尺的水柱下的城市,气象学家很难描述它在人类身上的规模年表。” [2] “有人称之为 500 年的洪水,自克里斯托弗·哥伦布到达新大陆海岸以来只会发生一次的灾难性天气事件。无论它可以被称为 700 年的洪水还是 300-年洪水值得商榷。” [3] “洪水的规模和威力是前所未有的。虽然红河以前曾肆虐过中西部上游,但法戈和大福克斯的洪峰高度几乎无法理解。” [4] “但气候记录的破坏速度比以往任何时候都快。一场 100 年的风暴可能在几年内重复发生,就像等待另一个世纪一样。这只是一种对严重程度进行分类的方法,而不是频率。\“那里不再是真正的百年事件,”国家海洋和大气管理局的气候学家汤姆·卡尔说。” [5] “美国可靠、一致的天气记录只能追溯到 150 年前左右。人类的发展已经改变了地球的表面和大气,促进了比未受破坏的环境本身产生的更大的天气变化和影响。” [6] “切萨皮克湾可能发生 500 年的事件尚不确定。去年是淡水涌入海湾的记录。1996 年 1 月流入河口的融雪洪流记录了超过1972 年的热带风暴艾格尼丝是这些地区 100 年气象事件的基准。但是,根据美国地质调查局的数据,对海湾生态系统的影响不像 1972 年那样具有破坏性。 [7] “在过去的一个世纪里,海湾的海平面上升了近一英尺,是过去 5000 年的三倍,马里兰大学的科学家斯蒂芬莱瑟曼将其与全球气候变暖联系在一起。河口岛屿和高地海岸线正在侵蚀加快步伐。” [8] “当然,海湾流域的地形与红河的地形不同。这不仅仅是流量和降雨量,还有水的流向以及它可以在哪里逃逸而不会侵入太远的旱地。我们只能希望再过 500 年,切萨皮克地区才会受到如此考验。” [9]“发布日期:4/22/97” [10] "" [11]《出版日期:1997年4月22日》

最后,findft[1] 对应 endft[1] 以此类推,直到 findft[100] 和 endft[100]。

【问题讨论】:

你能提供一个reprex数据示例吗? 拥有一两行数据会很有帮助。我的猜测是 findft 会给你“全文”被加工的行。与 endft 相同。问题是文档中的一行是什么意思? 【参考方案1】:

我假设findft 将包含多个索引以及endft。我还假设它们都具有相同的长度并且它们由相同的索引配对(例如findft[5] 对应于endft[5])并且您希望这两个索引之间的所有 NPfile 元素以及其他对.

如果是这样,请尝试:

ftfield = lapply(1:length(findft), function(x) NPFile[findft[x]:endft[x]] )

这将返回一个列表。我不能保证这会奏效,因为没有可使用的数据示例。

【讨论】:

【参考方案2】:

我们可以通过Map 做到这一点。获取 'findft' 到 'endft' 的每个对应元素的值序列,然后根据该索引对 'NPFile' 进行子集化

Map(function(x, y) NPFile[x:y], findft, endft)

【讨论】:

以上是关于如何在 R 中处理文本文件的所有元素的主要内容,如果未能解决你的问题,请参考以下文章

R:从文本文件运行多行 sql

QT中怎样读取中文文本文件!

如何在 R 中处理文本文件的所有元素

在c语言中怎样打开一个文本文档

如何在 Python 中对大文本文件流进行过滤和排序

文本文档格式下,如何把一列数据改为连续的行数据?