R:使用read.table以双引号加载数据

时间:2017-09-16 01:37:32

标签: r csv

我的csv版本数据如下:

name,words,name
John, "He says:"I love it!"", 18

首先,我尝试使用

加载数据
data <- read.table("data.csv",header = T,sep = ',',quote = "",stringsAsFactors = FALSE)

错误是:

Error in scan(file = file, what = what, sep = sep, quote = quote, dec = dec,  : 
  line 1 did not have 3 elements

好吧,我可以理解,因为R弄乱了很多双引号。

我用

修复了它
data <- read.table("data.csv",header = T,sep = ',',quote = "\"",,stringsAsFactors = FALSE) #change the name of the output file 

然而,我无法理解为什么会这样,R如何知道他应该停留哪些双引号呢?

1 个答案:

答案 0 :(得分:1)

嗯,这是一种有趣的数据格式 - 以及有趣的行为。帮助页面显示“请参阅扫描嵌入在引号中的引号的行为”,但我在该帮助页面中没有看到任何有用的东西,所以我尝试了一些东西。

我认为quote参数的作用是告诉R忽略引号之间出现的任何sep元素,并删除任何quote元素(因为这意味着要使用仅用于分隔列,而不是用于分隔数据)。因此,这只适用于您,因为您在words列中的第二个引号后没有任何逗号。

以下是四个例子。

引号中没有逗号(您的示例)

name,words,name
John, "He says:"I love it!"", 18

有趣的是,这个示例适用于我的两个版本的代码。第一个留下所有引号,第二个删除它们。

read.table("data.csv", header = TRUE, sep = ',', quote = "", stringsAsFactors = FALSE)
##   name                   words name.1
## 1 John  "He says:"I love it!""     18
read.table("data.csv", header = TRUE, sep = ',', quote = "\"", stringsAsFactors = FALSE)
##   name               words name.1
## 1 John  He says:I love it!     18
第一个引用后的

逗号

name,words,name
John, "He says, "I love it!"", 18

这里第一个版本(quote="")根据逗号将行分为四列而不是三列,并使用额外列作为rownames。第二个版本忽略添加的逗号,但也删除实际报价周围的引号。

read.table("text.csv", header = TRUE, sep = ',', quote = "", stringsAsFactors = FALSE)
##           name          words name.1
## John  "He says  "I love it!""     18
read.table("text.csv", header = TRUE, sep = ',', quote = "\"", stringsAsFactors = FALSE)
##   name                words name.1
## 1 John  He says, I love it!     18
第二个引用后的

逗号

name,words,name
John, "He says: "I love it, do you?"", 18

这两个版本几乎完全相同(四列),因为逗号不在配对引号之间。第一个保留引号,第二个没有。

read.table("text.csv", header = TRUE, sep = ',', quote = "", stringsAsFactors = FALSE)
##                       name      words name.1
## John  "He says: "I love it  do you?""     18
read.table("text.csv", header = TRUE, sep = ',', quote = "\"", stringsAsFactors = FALSE)
##                     name    words name.1
## John  He says: I love it  do you?     18
两个引号之间的

逗号

name,words,name
John, "He says, "I love it, do you?"", 18

这里第一个不起作用,因为它在第一行中找到三个列名但是五列。第二个跳过第一个逗号,但不跳过第二个逗号,所以再次将它分成四列,并使用extra作为行名。

read.table("text.csv", header = TRUE, sep = ',', quote = "", stringsAsFactors = FALSE)
## Error in read.table("text.csv", header = TRUE, sep = ",", quote = "",  : 
##  more columns than column names
read.table("text.csv", header = TRUE, sep = ',', quote = "\"", stringsAsFactors = FALSE)
##                     name    words name.1
## John  He says, I love it  do you?     18

最后,所有这些例子只有一行;如果你有多行并且他们分析成不同数量的列,你会得到一个类似于你得到的错误,除了列数不同的第一行。

我对你的错误感到惊讶的是它发生在第1行;如果R认为你在该行中有少于三列(它在标题行中找到的数字),你会得到这个错误,但在我的系统上,无论如何,它在该行中找到三个元素。