read.delim
读取表格式的数据(具有Excel中的行和列)。它对于读取文本字符串不是很有用。
要将文本从文本文件读取到R中,可以使用readLines()
。 readLines()
创建一个字符向量,该向量具有与文本行一样多的元素。对于此类软件,一行是任何以换行符结尾的文本字符串。 (在Wikipedia上了解有关newline的信息。)在编写文本时,您可以通过按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上了解
escaping。
readLines()
可能会输出一条警告,提示您在文件中找到“未完成的最后一行”。这仅意味着最后一行之后没有换行符。您可以使用
readLines(..., warn = FALSE)
禁止显示此警告,但这不是必须的,这不是错误,并且取消警告只会抑制警告消息。
如果您不想只将文本输出到R控制台,而是进一步处理它,请创建一个保存
readLines()
输出的对象:
mytext <- readLines("textfile.txt")
除了
readLines()
之外,您还可以使用
scan()
,
readBin()
和其他功能从文件中读取文本。通过输入
?scan
等查看手册。查看
?connections
以了解将文件读入R的许多不同方法。
我强烈建议您在文本编辑器(如Vim,记事本,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将无法知道不应在“Mr.”之后拆分。您必须在正则表达式中定义异常。对此进行解释超出了此问题的范围。
您不知道如何告诉R如何识别主题或物体。