web-dev-qa-db-fra.com

read.csv, en-tête sur la première ligne, saute la deuxième ligne

J'ai un fichier CSV avec deux lignes d'en-tête, la première ligne que je veux être l'en-tête, mais la deuxième ligne que je veux ignorer. Si je fais la commande suivante:

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

La première ligne devient l'en-tête et la deuxième ligne du fichier devient la première ligne de mon cadre de données:

  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

Je veux sauter cette deuxième ligne du fichier CSV et juste obtenir

  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

J'ai essayé data <- read.csv("HK Stocks bbg.csv", header = T, stringsAsFactors = FALSE, skip = 1) mais cela retourne:

        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

La ligne d'en-tête provient de la deuxième ligne de mon fichier CSV, pas de la première ligne.

Je vous remercie.

25
mchangun

Cela devrait faire l'affaire:

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

La première étape, à l'aide de readLines, lit le fichier entier dans une liste, chaque élément de la liste représentant une ligne du fichier. Ensuite, vous supprimez la deuxième ligne en utilisant le fait que l'indexation négative dans R signifie select all but this index. Enfin, nous transmettons ces données à read.csv pour les traiter en un data.frame.

46
Paul Hiemstra

Vous pouvez supprimer la ou les premières lignes après l'en-tête directement du dataframe, pour vous permettre de le faire en une seule ligne:

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

si mon fichier de données "test.txt" est le suivant:

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

cela me donne 

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

Cela répond exactement à votre question, mais pour généraliser, vous pouvez également ignorer les lignesNà laMth:

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

où N et M sont des nombres entiers bien sûr.


Remarque: Cette méthode convertira toutes les colonnes en facteur.

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
2
Adrian Tompkins

Sous Linux (ou Mac), vous pouvez utiliser les commandes linux dans data.table::fread, donc

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

passera la deuxième ligne. 

0
daknowles