【问题标题】:How can I ignore null headers in a .csv file?如何忽略 .csv 文件中的空标题?
【发布时间】:2014-05-08 11:51:48
【问题描述】:

如何忽略 .csv 文件中的空标题?

我有一个这样的 csv 文件

http://190.12.101.70/~digicelc/gestion/reportes/import/liquidacion/13958642917519.csv

我的代码是

data <- read.csv('1.csv',header = T, sep=";")

R 告诉我

  more columns than column names

我不想跳过文件头

谢谢!

【问题讨论】:

  • 嗨,user1532587,欢迎来到本网站!实际上,这个网站更多的是统计问题,而不是编程问题。 StackOverflow 有很多 R 程序员,他们有时可以比我们更好、更快地回答这些问题,尽管您也可以在这里得到答案。
  • 你能发一个链接到1.csv吗?文件中可能有一些更独特的东西,我们没有从粘贴中看到

标签: r csv rstudio


【解决方案1】:

我在这里看不到相同的行为。 R 将默认列名和 NA 添加到不可用的数据。

> data <- read.csv("test.csv", header = TRUE, sep = ";")
> data    
  col1      col2      col3       col4          X X.1
1 val1      val2      val3       val4       val5  NA
2 val1      val2      val3       val4       val5  NA

您使用的是最新版本吗?

【讨论】:

【解决方案2】:

但错误消息会告诉您确切的问题所在。您的列多于列名。

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 也聊胜于无。)

【讨论】:

  • 即您的问题不清楚。是否要使用第一行中的名称来命名前 28 列数据?
  • 是的,我们的想法是取名字,然后是标准变量,如 V1、V2 或其他 - 否则有没有办法跳过这些?
猜你喜欢
  • 2019-12-01
  • 2012-01-15
  • 1970-01-01
  • 1970-01-01
  • 2016-09-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-12-21
相关资源
最近更新 更多