9

这是我在这里的第一个问题,我是 R 新手,试图弄清楚如何进行数据处理的第一步,请保持简单:)

我想知道 R 中加载非结构化文本数据以进行进一步处理的最佳功能和有用的数据结构是什么。例如,假设我有一本书存储为文本文件,其中没有换行符。

read.delim()在列表中使用和存储数据是个好主意吗?还是字符向量更好,我将如何定义它?

先感谢您。

PN

PS如果我使用“。” 作为我的分隔符,它会处理像“先生”这样的东西。作为一个单独的句子。虽然这只是一个例子,我并不担心这个缺陷,只是为了教育目的,我仍然很好奇你会如何解决这个问题。

4

1 回答 1

11

read.delim以表格格式读取数据(包括行和列,如在 Excel 中)。它对于阅读一串文本不是很有用。

要将文本文件中的文本读入 R,您可以使用readLines(). readLines()创建一个包含与文本行一样多的元素的字符向量。对于此类软件,行是任何以换行符结尾的文本字符串。(阅读 Wikipedia 上的换行符。)编写文本时,按 输入系统特定的换行符Return。实际上,一行文本不是由软件窗口的宽度定义的,而是可以跨越许多可视行。实际上,一行文本就是一本书中的一个段落。因此readLines(),在段落中拆分您的文本:

> readLines("/path/to/tom_sawyer.txt")
[1] "\"TOM!\""                                                                                                                                                                                                                                                                                                                                                                                                                                                                       
[2] "No answer."                                                                                                                                                                                                                                                                                                                                                                                                                                                                     
[3] "\"TOM!\""                                                                                                                                                                                                                                                                                                                                                                                                                                                                       
[4] "No answer."                                                                                                                                                                                                                                                                                                                                                                                                                                                                     
[5] "\"What's gone with that boy,  I wonder? You TOM!\""                                                                                                                                                                                                                                                                                                                                                                                                                             
[6] "No answer."                                                                                                                                                                                                                                                                                                                                                                                                                                                                     
[7] "The old lady pulled her spectacles down and looked over them about the room; then she put them up and looked out under them. She seldom or never looked through them for so small a thing as a boy; they were her state pair, the pride of her heart, and were built for \"style,\" not service—she could have seen through a pair of stove-lids just as well. She looked perplexed for a moment, and then said, not fiercely, but still loud enough for the furniture to hear:"
[8] "\"Well, I lay if I get hold of you I'll—\"

请注意,您可以在 Stackoverflow 中将长文本滚动到左侧。第七行比这列宽。

如您所见,readLines()将那长长的第七段读为一行。而且,您还可以看到,readLines()在每个引号前添加了一个反斜杠。由于 R 将各个行放在引号中,因此需要将这些行与原始文本中的行区分开来。因此,它“转义”了原始引号。在 Wikipedia 上阅读有关转义的信息。

readLines()可能会输出在您的文件中发现“不完整的最后一行”的警告。这仅意味着最后一行之后没有换行符。您可以使用 取消此警告readLines(..., warn = FALSE),但您不必这样做,这不是错误,并且取消警告只会取消警告消息。

如果您不想只将文本输出到 R 控制台而是进一步处理它,请创建一个包含以下输出的对象readLines()

mytext <- readLines("textfile.txt")

此外readLines(),您还可以使用scan(),readBin()和其他功能从文件中读取文本。通过输入?scanetc 查看手册。查看?connections以了解将文件读入 R 的许多不同方法。

我强烈建议您在 Vim、Notepad、TextWrangler 等文本编辑器中将文本写入 .txt 文件,而不是在 MS Word 等文字处理器中编写。Word 文件包含的不仅仅是您在屏幕上看到的或打印出来的文本,而且这些文本将被 R 读取。您可以尝试看看您得到了什么,但为了获得良好的结果,您应该将文件保存为 Word 中的 .txt 文件,或者在文本编辑器中编写它。

您还可以将在任何其他软件中打开的文本文件中的文本复制粘贴到 R 或在 R 控制台中编写文本:

myothertext <- c("What did you do?
+ I wrote some text.
+ Ah, interesting.")
> myothertext
[1] "What did you do?\nI wrote some text.\nAh, interesting."

请注意Return,在我用 . 关闭字符串之前,输入不会导致 R 执行命令")。R 只是回复+,告诉我我可以继续编辑。我没有输入这些优点。尝试一下。另请注意,现在换行符是您的文本字符串的一部分。(我在 Mac 上,所以我的换行符是\n.)

如果您手动输入文本,我会将整个文本作为一个字符串加载到向量中:

x <- c("The text of your book.")

您可以将不同的章节加载到此向量的不同元素中:

y <- c("Chapter 1", "Chapter 2")

为了更好地参考,您可以命名元素:

z <- c(ch1 = "This is the text of the first chapter. It is not long! Why was the author so lazy?", ch2 = "This is the text of the second chapter. It is even shorter.")

现在您可以拆分这些向量中的任何一个的元素:

sentences <- strsplit(z, "[.!?] *")

进入?strsplit阅读该功能的手册并了解它所需要的属性。第二个属性采用正则表达式。在这种情况下,我告诉strsplit在三个标点符号中的任何一个处拆分向量的元素,然后是一个可选的空格(如果您没有在此处定义空格,则生成的“句子”前面将有一个空格)。

sentences现在包含:

> sentences
$ch1
[1] "This is the text of the first chapter" "It is not long"                       
[3] "Why was the author so lazy"           

$ch2
[1] "This is the text of the second chapter" "It is even shorter"

您可以通过索引访问各个句子:

> sentences$ch1[2]
[3] "It is not long"

R 将无法知道它不应该在“先生”之后拆分。您必须在正则表达式中定义异常。解释这一点超出了这个问题的范围。

你将如何告诉 R 如何识别主题或对象,我不知道。

于 2013-10-31T23:54:28.630 回答