但错误消息会告诉您确切的问题所在。您的列多于列名。
download.file("http://190.12.101.70/~digicelc/gestion/reportes/import/liquidacion/13958642917519.csv", destfile="1.csv")
D1 <- read.csv2("1.csv", skip=1, header=FALSE)
firstlines <- readLines("1.csv", 3)
splitthem <- strsplit(firstlines, ";")
sapply(splitthem, length)
# [1] 28 42 42
因此,您有 42 个数据列(用分号分隔),但有 28 个列名(同样,由列名分隔)。 R 怎么知道你想在哪一列中使用哪个名称? (“计算机擅长遵循指令,但不擅长读懂你的想法。” - Donald Knuth)。
您需要编辑源文件,以便每列都有一个名称或跳过第一行,然后从其他地方获取列名。
编辑
是的,我们的想法是先取名字,然后是标准变量,如 V1、V2 或
其他 - 否则有没有办法跳过这些?
好的,那我就使用上面的稍作修改:
download.file("http://190.12.101.70/~digicelc/gestion/reportes/import/liquidacion/13958642917519.csv", destfile="1.csv")
D <- read.csv2("1.csv", skip=1, header=FALSE)
header <- strsplit(readLines("1.csv", 3), ";")[[1]]
names(D)[1:length(header)] <- header
现在您已经命名了前 28 个变量,其余变量命名为 V29-V42。
您可以通过各种方式“跳过”其余名称。如果您按照另一个答案 (Dave) 中的建议进行操作,则基本上是
names(D) <- header
... 然后变量 29-42 将具有 NA 名称。这不是一个可用的名称,您只能通过列号来处理这些变量。或者你可以这样做:
names(D)[29:43] <- ""
现在你也不能使用这些名字了。
> D[[""]]
NULL
我认为给它们命名很有用,因为许多数据框操作都假定名称。例如,假设您有空名称(如上的“”)并尝试查看数据框的前几行:
head(D)
# skipped most of the output, keeping only column 42:
structure(c("-1", "70", ".5", "70", "266", "70"), class = "AsIs")
1 -1
2 70
3 .5
4 70
5 266
6 70
因此,当使用 head 时,您会看到带有有趣名称的数据框。或者另一个例子:
D[1:3,29:31]
.1 .2
1 C_COMPONENTE_LIQ_DESDE_CO 243 LIQUIDACION TOPE CO
2 C_COMPONENTE_LIQ_DESDE_CO 243 RESIDUAL CO
3 C_COMPONENTE_LIQ_DESDE_CO 243 RESIDUAL CO
- 现在第一个组件命名为“”,第二个命名为“.1”,第三个命名为“.2”。请查看以下 data.frame 帮助文件中的引用:
列名应该是非空的,并且尝试使用空名将会有
不支持的结果。允许重复的列名,但您需要使用 check.names
= FALSE 表示 data.frame 生成这样的数据帧。但是,并不是所有的操作
数据框将保留重复的列名:例如类似矩阵的子集
将强制结果中的列名是唯一的。
或者假设您在数据框的开头添加了一些列;如果您有 col 名称,那么您仍然可以将之前第 29 列的内容称为 D$V29,但使用 D[,29] 您会得到其他内容。
可能还有其他例子。换句话说,您可以在数据框中包含“未命名”列,但我认为这不是一个好主意。从技术上讲,数据框中的所有列都会有一个名称(它可以只是“”或 NA),那么为什么没有有意义的名称呢? (即使是 V29 也聊胜于无。)