Comment supprimer la première ligne d'une dataframe dans R?

85

J'ai un ensemble de données avec 11 colonnes avec plus de 1000 lignes chacune. Les colonnes étaient étiquetées V1, V2, V11, etc. J'ai remplacé les noms par quelque chose de plus utile pour moi en utilisant la commande "c". Je ne savais pas que la ligne 1 contenait également des étiquettes pour chaque colonne et mes données réelles commencent à la ligne 2.

Existe-t-il un moyen de supprimer la ligne 1 et de décrémenter?

akz
la source

Réponses:

139

Conservez les étiquettes de votre fichier d'origine comme ceci:

df = read.table('data.txt', header = T)

Si vous avez des colonnes nommées x et y, vous pouvez les adresser comme ceci:

df$x
df$y

Si vous souhaitez réellement supprimer la première ligne d'un data.frame, vous pouvez utiliser des indices négatifs comme celui-ci:

df = df[-1,]

Si vous souhaitez supprimer une colonne d'un data.frame, vous pouvez lui attribuer NULL:

df$x = NULL

Voici quelques exemples simples de création et de manipulation d'un data.frame dans R:

# create a data.frame with 10 rows
> x = rnorm(10)
> y = runif(10)
> df = data.frame( x, y )

# write it to a file
> write.table( df, 'test.txt', row.names = F, quote = F )

# read a data.frame from a file: 
> read.table( df, 'test.txt', header = T )

> df$x
 [1] -0.95343778 -0.63098637 -1.30646529  1.38906143  0.51703237 -0.02246754
 [7]  0.20583548  0.21530721  0.69087460  2.30610998
> df$y
 [1] 0.66658148 0.15355851 0.60098886 0.14284576 0.20408723 0.58271061
 [7] 0.05170994 0.83627336 0.76713317 0.95052671

> df$x = x
> df
            y           x
1  0.66658148 -0.95343778
2  0.15355851 -0.63098637
3  0.60098886 -1.30646529
4  0.14284576  1.38906143
5  0.20408723  0.51703237
6  0.58271061 -0.02246754
7  0.05170994  0.20583548
8  0.83627336  0.21530721
9  0.76713317  0.69087460
10 0.95052671  2.30610998

> df[-1,]
            y           x
2  0.15355851 -0.63098637
3  0.60098886 -1.30646529
4  0.14284576  1.38906143
5  0.20408723  0.51703237
6  0.58271061 -0.02246754
7  0.05170994  0.20583548
8  0.83627336  0.21530721
9  0.76713317  0.69087460
10 0.95052671  2.30610998

> df$x = NULL
> df 
            y
1  0.66658148
2  0.15355851
3  0.60098886
4  0.14284576
5  0.20408723
6  0.58271061
7  0.05170994
8  0.83627336
9  0.76713317
10 0.95052671
James Thompson
la source
3
Je ne sais pas s'il est clair pour @akz: dans header=Tl' Test synonyme de TRUE, donc ce paramètre indique R à en- tête de charge. Voir ?read.tablepour plus de détails.
daroczig le
Notez que si vous avez une trame de données à une seule colonne, veuillez consulter cette réponse - stackoverflow.com/a/3232770/4606130 où vous en aurez également besoin drop = FALSEen cas d'indexation négative
micstr
28

Vous pouvez utiliser l'indexation négative pour supprimer des lignes, par exemple:

dat <- dat[-1, ]

Voici un exemple:

> dat <- data.frame(A = 1:3, B = 1:3)
> dat[-1, ]
  A B
2 2 2
3 3 3
> dat2 <- dat[-1, ]
> dat2
  A B
2 2 2
3 3 3

Cela dit, vous pouvez avoir plus de problèmes que de simplement supprimer les étiquettes qui se sont retrouvées sur la ligne 1. Il est plus que probable que R ait interprété les données comme du texte et ensuite converties en facteurs. Vérifiez ce que dit str(foo), où se footrouve votre objet de données, sur les types de données.

Il semble que vous ayez juste besoin header = TRUEdans votre appel de lire les données (en supposant que vous les lisiez via read.table()ou l'un de ses wrappers.)

Gavin Simpson
la source
13

Personne ne veut probablement vraiment supprimer la première ligne. Donc, si vous cherchez quelque chose de significatif, c'est la sélection conditionnelle

#remove rows that have long length and "0" value for vector E

>> setNew<-set[!(set$length=="long" & set$E==0),]
user3495945
la source
Ceci est une réponse à une question qui n'a pas été posée. Je pense que c'est plus déroutant que d'aider.
U. Windl
12

Bien que je sois d'accord avec la réponse la plus votée, voici une autre façon de conserver toutes les lignes sauf la première:

dat <- tail(dat, -1)

Cela peut également être accompli en utilisant le dplyrpackage de Hadley Wickham .

dat <- dat %>% slice(-1)
EMcKinney
la source
7

Je ne suis pas un expert, mais cela peut aussi fonctionner,

dat <- dat[2:nrow(dat), ]
Bipul Mohanto
la source
En fait, cela ne fonctionne pas lorsque nrow(dat) == 1: Ensuite, la date d'origine est conservée.
U. Windl
6

dat <- dat[-1, ]a fonctionné mais il a tué mon dataframe, le changeant en un autre type. A dû utiliser à la place, dat <- data.frame(dat[-1, ])mais c'est peut-être un cas particulier car cette base de données ne comportait initialement qu'une seule colonne.

cardamome
la source
Ceci est un commentaire, pas une réponse! Malgré cela, je n'ai pas pu reproduire.
U. Windl