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

时间:2014-03-28 20:00:07

标签: r csv rstudio

如何忽略.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

我不想跳过文件的标题

谢谢你!

2 个答案:

答案 0 :(得分:2)

我在这里看不到同样的行为。 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

您使用的是最新版本吗?

答案 1 :(得分:0)

但是错误消息会告诉您问题究竟是什么。列数多于列名。

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怎么会知道你想用哪个名字去哪个列? (&#34;计算机擅长遵循指示,但不是在阅读你的想法。&#34; - 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。

你可以&#34;跳过&#34;其余的名字以各种方式。如果你按照另一个答案(戴夫)的建议去做,基本上就是

names(D) <- header

...然后变量29-42将具有NA名称。这不是可用的名称,您只能通过列号来处理这些变量。或者你可以这样做:

names(D)[29:43] <- ""

现在你也不能使用这些名字。

> D[[""]]
NULL

我认为给它们起名称是有用的,因为许多数据框操作都会假定名称。例如,假设您有空名称(&#34;&#34;如上所述)并尝试查看数据框的前几行:

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
  • 第一个组件现在命名为#34;&#34;,第二个组件命名为#34; .1&#34;,第三个组件命名为#34; .2&#34;。请查看以下data.frame帮助文件中的引用:
  

列名称应为非空,并尝试使用空名称   不支持的结果。允许使用重复的列名,但您需要使用check.names   对于data.frame生成这样的数据帧= FALSE。但是,并非所有操作都在   数据框将保留重复的列名称:例如类似矩阵的子集   将强制结果中的列名称是唯一的。

或者假设您在数据框的开头添加了一些列;如果你有col的名字那么你仍然可以将之前的第29列作为D $ V29来解决,但是使用D [,29]你会得到别的东西。

可能还有其他例子。换句话说,你可以拥有&#34;未命名&#34;数据框中的列,但我不认为这是一个好主意。从技术上讲,数据框中的所有列都将始终具有名称(它可以是&#34;&#34;或NA),那么为什么没有有意义的名称呢? (甚至V29总比没有好。)