【问题标题】:How can I read the header but also skip lines - read.table()?如何阅读标题但也跳过行 - read.table()?
【发布时间】:2019-05-15 14:24:47
【问题描述】:

数据.txt:

Index;Time;
1;2345;
2;1423;
3;5123;

代码:

dat <- read.table('data.txt', skip = 1, nrows = 2, header =TRUE, sep =';')

结果:

  X1 X2345
1  2  1423
2  3  5123

我希望header是Index和Time,如下:

  Index Time
1   2   1423
2   3   5123

我该怎么做?

【问题讨论】:

  • @DavidArenburg 确实是您将可能是最佳方法联系起来的公认答案
  • 您是否考虑过结合使用 head() 和 tail() 函数?根据您的深入程度,它可能会变得非常嵌套,但我相信这会为您提供所需的内容。

标签: r header skip read.table read.csv


【解决方案1】:

恐怕没有直接的方法可以实现这一目标。要么您阅读整个表格,然后删除您不想要的行,要么您在表格中阅读两次并稍后分配标题:

header <- read.table('data.txt', nrows = 1, header = FALSE, sep =';', stringsAsFactors = FALSE)
dat    <- read.table('data.txt', skip = 2, header = FALSE, sep =';')
colnames( dat ) <- unlist(header)

【讨论】:

  • 你需要把, stringsAsFactors=FALSE放在你的第一行才能工作。
  • @Thomas 我同意应该这样做,尽管我真的不明白为什么必须这样做。至少我手头没有必要的例子。
  • 如果没有它,此代码不适用于 OP 的示例文件...至少在我的机器上不行。
  • @Thomas 你是对的。原因是(我相信你知道)在 OP 的示例中,所有行都以; 结尾,给出了一个缺失的列和包含NA 的列名。这在调用unlist(header) 时确实会产生问题。
  • fwiw 我用as.is=T 而不是stringsAsFactors=FALSE,它似乎工作得一样。
【解决方案2】:

您使用的跳过不正确。试试这个:

dat <- read.table('data.txt', nrows = 2, header =TRUE, sep =';')[-1, ]

【讨论】:

  • 如果我有小型数据集,这将起作用。但是,比如说,我想跳过 600000 行并将第一行作为我的列名。你的代码会浪费很多内存。
  • 这仍然没有给我想要的输出,我只得到Index 2 Time 1423
【解决方案3】:

使用来自data.tablefread 的解决方案。

require(data.table)
fread("Data.txt", drop = "V3")[-1]

结果:

> fread("Data.txt", drop = "V3")[-1]
   Index Time
1:     2 1423
2:     3 5123

【讨论】:

    【解决方案4】:

    代替read.table(),使用readr 函数,例如read_csv(),通过管道传送到dplyr::slice()

    library(readr)
    library(dplyr)
    dat <- read_csv("data.txt") %>% slice(-1)
    

    速度也很快。

    【讨论】:

    • 我刚刚发现了这个并且有类似的情况。由于第二行与其余数据的格式不同,readr 的列规范如何工作?导入数据后有没有好办法分配列类型?
    【解决方案5】:

    您可以(在大多数情况下),sub 在结尾 ; 之外写一个没有第二行的新文件(由于标题,这实际上是第一行),并使用 read.csv 而不是 @987654324 @

    > txt <- "Index;Time;
      1;2345;
      2;1423;
      3;5123;" 
    > writeLines(sub(";$", "", readLines(textConnection(txt))[-2]), 'newTxt.txt')
    > read.csv('newTxt.txt', sep = ";")
    ##   Index Time
    ## 1     2 1423
    ## 2     3 5123
    

    【讨论】:

    • 这对于大文件来说效率很低。我最近尝试了这个,对于一些较小的文件它非常慢,但对于较大的文件它从来没有完成。
    猜你喜欢
    • 2011-02-04
    • 2015-08-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-02-04
    相关资源
    最近更新 更多