我的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如何知道他应该停留哪些双引号呢?
答案 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认为你在该行中有少于三列(它在标题行中找到的数字),你会得到这个错误,但在我的系统上,无论如何,它在该行中找到三个元素。