read.csv()的输出结果

5

我一直试图把一个csv文件加载到R中进行处理,但是在尝试读取数据时遇到了奇怪的问题。

这个csv文件没有任何标题,我使用以下简单的代码读取数据:

newClick <- read.csv("test.csv", header = F)

以下是样本数据集:
10000011791441224671,V_Display,exit
10000011951441812316,V_Display,exit
10000013211441319797,V_Display,exit
1000001331441725509,V_Display,exit
10000013681418242863,C_GoogleNonBrand,V_Display,V_Display,V_Display,V_Display,_Display,V_Display,V_Display,V_Display,V_Display,V_Display,V_Display,V_Display,V_Display,V_Display,V_Display,exit
10000014031441295393,V_Display,exit

这份数据的输出结果应该是一个包含18列,6行的预期数据框。

然而,这里有一个棘手的部分。如果我在数据集中添加另一行,例如:

10000011791441224671,V_Display,exit
10000011951441812316,V_Display,exit
1000000191441228436,V_Display,exit
10000013211441319797,V_Display,exit
1000001331441725509,V_Display,exit
10000013681418242863,C_GoogleNonBrand,V_Display,V_Display,V_Display,V_Display,V_Display,V_Display,V_Display,V_Display,V_Display,V_Display,V_Display,V_Display,V_Display,V_Display,V_Display,exit
10000014031441295393,V_Display,exit

这个的输出结果是12行3列的怪异数据。经过仔细分析,我发现整个倒数第二行被分成了6行,每行有三列,这很奇怪。您对此有何想法吗?

4
根据 ?read.table 的说明,数据列的数量是通过查看前五行输入内容(如果少于五行则查看全部内容),或者如果指定了 col.names 参数且其长度更长,则根据其长度来确定的。 - nicola
@Nicola 谢谢 一旦你掌握了基础,理解剩下的部分就变得容易了。 - hbabbar
2个回答

3

如评论所述,这是因为列数由输入的前五行确定。如果你有困难,这里有一个可能的解决方法,我已经测试过,运行良好。秘诀是输入一个向量作为col.names,向量长度为数据中的列数。我们可以使用count.fields()获取列数。将你的文件名插入file中。

## get the number of columns
ncols <- max(count.fields(file, sep = ","))
## read the data with all columns as character
df <- read.csv(file, header = FALSE, col.names = paste0("V", seq_len(ncols)))

这是使用您的数据测试过的代码:
txt <- "10000011791441224671,V_Display,exit\n10000011951441812316,V_Display,exit\n1000000191441228436,V_Display,exit\n10000013211441319797,V_Display,exit\n1000001331441725509,V_Display,exit\n10000013681418242863,C_GoogleNonBrand,V_Display,V_Display,V_Display,V_Display,V_Display,V_Display,V_Display,V_Display,V_Display,V_Display,V_Display,V_Display,V_Display,V_Display,V_Display,exit\n10000014031441295393,V_Display,exit"

ncols <- max(count.fields(textConnection(txt), sep = ","))
df <- read.csv(text = txt, header = FALSE, col.names = paste0("V", seq_len(ncols)))
dim(df)
# [1]  7 18

-1

根据r文档

“数据列的数量是通过查看输入的前五行(如果少于五行,则为整个输入)或col.names的长度(如果指定且更长)来确定。如果fill或blank.lines.skip为true,则这可能是错误的,因此必要时请指定col.names”

由于第一个示例中的前5行包含更广泛的观察结果,而第二个示例中没有,因此数据集在第一个示例中正确地显示,而在第二个示例中则被分成不同的行。

确保不会发生这种情况的方法是在CSV中添加列标题,或使用read.csv函数的col.name参数定义正确的列数。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接