如何在使用read.table()函数时读取表头但跳过部分行?

32

数据.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
我希望标题应该是“Index”和“Time”,如下所示:

Index

Time

  Index Time
1   2   1423
2   3   5123

我该怎么做?


2
可能是重复的问题 https://dev59.com/cWUo5IYBdhLWcg3wpg_N - David Arenburg
@DavidArenburg 确实是你链接的被接受的答案,这可能是最好的方法。 - Beasterfield
你有考虑使用head()和tail()函数的组合吗?根据你的递归深度可能会产生很多嵌套,但我相信这将给你带来你想要的结果。 - daneshjai
5个回答

40

很抱歉,没有直接的方法可以实现这一点。要么您阅读整个表格并在之后删除不需要的行,要么您在表格中读取两次并稍后分配标题:

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)

1
你需要在第一行加上 , stringsAsFactors=FALSE 才能使其正常工作。 - Thomas
@Thomas 我同意这个应该被做,虽然我不是很清楚为什么一定要这样做。至少我手头没有一个必须这样做的例子。 - Beasterfield
这段代码在没有OP的示例文件的情况下无法工作...至少在我的机器上是这样。 - Thomas
1
@Thomas 你说得对。原因是(我相信你知道),在 OP 的例子中,所有行都以 ; 结尾,导致缺少一列和包含 NA 的列名。这确实会在调用 unlist(header) 时出现问题。 - Beasterfield
就我个人而言,我使用了 as.is=T 而不是 stringsAsFactors=FALSE,看起来效果一样。 - airstrike

8

您正在错误地使用skip。请尝试以下方法:

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

如果我的数据集很小,那么这个方法可以工作。但是,假设我想跳过600000行并将第一行作为列名,你的代码会浪费很多内存。 - hans-t
这对我仍然没有产生期望的输出,我只得到了Index 2 Time 1423 - Csislander

3

使用readr函数,例如read_csv(),而不是read.table(),并将其管道传递到dplyr::slice()

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

它也非常快速。


1
我刚刚发现了这个问题,我的情况也类似。由于第二行的格式与其余数据不同,readr的列规范是如何工作的?在导入数据后有没有好的方法来分配列类型? - Andrew Jackson

3
使用 `data.table` 中的 `fread` 函数来解决问题。
require(data.table)
fread("Data.txt", drop = "V3")[-1]

结果:

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

1
你可以(在大多数情况下)将结尾的分号 ; 替换为 sub,写一个新文件而不包括第二行(因为它是标题所以实际上是第一行),并使用 read.csv 而不是 read.table
> 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

1
这对于大文件来说非常低效。我最近尝试过这个,对于一些较小的文件速度非常慢,但对于较大的文件从未完成。 - Max Candocia

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接