【问题标题】:read.csv, header on first line, skip second line [duplicate]read.csv,第一行的标题,跳过第二行[重复]
【发布时间】:2013-03-29 09:52:50
【问题描述】:

我有一个包含两个标题行的 CSV 文件,第一行我想成为标题,但第二行我想丢弃。如果我执行以下命令:

data <- read.csv("HK Stocks bbg.csv", header = T, stringsAsFactors = FALSE)

第一行成为标题,文件的第二行成为我的数据框的第一行:

  Xaaaaaaaaa       X X.1     Xbbbbbbbbbb     X.2 X.3
1         Date PX_LAST  NA         Date PX_LAST  NA
2   31/12/2002  38.855  NA   31/12/2002  19.547  NA
3   02/01/2003  38.664  NA   02/01/2003  19.547  NA
4   03/01/2003  40.386  NA   03/01/2003  19.547  NA
5   06/01/2003  40.386  NA   06/01/2003  19.609  NA
6   07/01/2003  40.195  NA   07/01/2003  19.609  NA

我想跳过 CSV 文件的第二行,直接获取

  X1.HK.Equity       X X.1 X2.HK.Equity     X.2 X.3
2   31/12/2002  38.855  NA   31/12/2002  19.547  NA
3   02/01/2003  38.664  NA   02/01/2003  19.547  NA
4   03/01/2003  40.386  NA   03/01/2003  19.547  NA
5   06/01/2003  40.386  NA   06/01/2003  19.609  NA
6   07/01/2003  40.195  NA   07/01/2003  19.609  NA

我尝试了data &lt;- read.csv("HK Stocks bbg.csv", header = T, stringsAsFactors = FALSE, skip = 1) 但返回:

        Date PX_LAST  X     Date.1 PX_LAST.1 X.1
1 31/12/2002  38.855 NA 31/12/2002    19.547  NA
2 02/01/2003  38.664 NA 02/01/2003    19.547  NA
3 03/01/2003  40.386 NA 03/01/2003    19.547  NA
4 06/01/2003  40.386 NA 06/01/2003    19.609  NA
5 07/01/2003  40.195 NA 07/01/2003    19.609  NA
6 08/01/2003  40.386 NA 08/01/2003    19.547  NA

标题行来自我的 CSV 文件的第二行,而不是第一行。

谢谢。

【问题讨论】:

  • 您可以尝试两步法。在第一步中从第 3 行开始读取没有标题的数据。只读取第一行作为字符向量,然后将字符向量添加为数据的名称。
  • 我检查了你的代码,这条线对我有用:df
  • 我很困惑为什么这个问题被标记为与一年后提出的问题的重复,不应该反过来吗?

标签: r header skip read.csv


【解决方案1】:

在 Linux(或 Mac)上,您可以利用能够在 data.table::fread 中使用 linux 命令的优势,所以

data.table::fread("sed -e '2d' myfile.txt", data.table = F)

将跳过第二行。

【讨论】:

    【解决方案2】:

    您可以直接从数据框中删除标题后的第一行,以便您在一行中执行此操作:

    df<-read.csv("test.txt",header=T)[-1,]
    

    如果我的数据文件“test.txt”如下:

    var1, var2
    units1, units2
    2.3,6.8
    4.5,6.7
    

    这给了我

    > read.csv("test.txt",header=T)[-1,]
    var1 var2
    2  2.3  6.8
    3  4.5  6.7
    

    这完全回答了你的问题,但只是为了概括答案,你也可以这样跳过第 NM 行:

    df<-read.csv("test.txt",header=T)[-N:-M,]
    

    其中 N 和 M 当然是整数。


    注意:此方法会将所有列转换为因子。

    str(read.csv("test.csv", header = TRUE)[-1,])
    # 'data.frame': 2 obs. of  2 variables:
    #   $ var1: Factor w/ 3 levels "2.3","4.5","units1": 1 2
    #   $ var2: Factor w/ 3 levels " units2","6.7",..: 3 2
    

    【讨论】:

      【解决方案3】:

      这应该可以解决问题:

      all_content = readLines("file.csv")
      skip_second = all_content[-2]
      dat = read.csv(textConnection(skip_second), header = TRUE, stringsAsFactors = FALSE)
      

      使用readLines 的第一步将整个文件读入一个列表,其中列表中的每个项目代表文件中的一行。接下来,使用 R 中的负索引表示 select all but this index 这一事实丢弃第二行。最后,我们将此数据提供给read.csv 以将其处理成data.frame

      【讨论】:

      • 感谢您的回复。最后一行dat = read.csv(skip_second, header = TRUE, stringsAsFactors = FALSE) 给了我一个错误Error in file(file, "rt") : invalid 'description' argument。如何让 read.csv 接受变量而不是文件路径?
      • 另外使用textConnection
      • 作为提醒 Paul,这种方法在处理较小的文件(小于 5MB)时效果很好,但在处理较大的文件时会遇到问题。我问了一个问题,并在让它在更大的文件上很好地工作后提供了一个答案:stackoverflow.com/questions/24921387/…
      猜你喜欢
      • 2023-03-22
      • 2016-08-30
      • 2015-01-09
      • 2022-11-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-09-21
      • 2023-03-18
      相关资源
      最近更新 更多