web-dev-qa-db-fra.com

Comment puis-je lire l'en-tête mais aussi sauter des lignes - read.table ()?

Data.txt:

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

Le code:

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

Le résultat:

  X1 X2345
1  2  1423
2  3  5123

Je m'attends à ce que l'en-tête soit Index et Time, comme suit:

  Index Time
1   2   1423
2   3   5123

Comment je fais ça?

26
hans-t

Je crains qu'il n'y ait aucun moyen direct d'y parvenir. Soit vous lisez l'intégralité du tableau et supprimez ensuite les lignes que vous ne souhaitez pas, soit vous lisez deux fois dans le tableau et attribuez l'en-tête ultérieurement:

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)
36
Beasterfield

Vous utilisez incorrectement le saut. Essaye ça:

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

Au lieu de read.table(), utilisez une fonction readr telle que read_csv(), dirigée vers dplyr::slice().

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

C'est très rapide aussi.

2
Joe

La solution utilisant fread de data.table.

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

Résultat:

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

Vous pouvez (dans la plupart des cas), sub la fin ; écrire un nouveau fichier sans la deuxième ligne (qui est vraiment la première ligne à cause de l'en-tête), et utiliser read.csv au lieu de 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
0
Rich Scriven