Wie lösche ich die erste Zeile eines Datenrahmens in R?

84

Ich habe einen Datensatz mit 11 Spalten mit jeweils über 1000 Zeilen. Die Spalten waren mit V1, V2, V11 usw. gekennzeichnet. Ich habe die Namen mit dem Befehl "c" durch etwas ersetzt, das für mich nützlicher ist. Ich wusste nicht, dass Zeile 1 auch Beschriftungen für jede Spalte enthält und meine tatsächlichen Daten in Zeile 2 beginnen.

Gibt es eine Möglichkeit, Zeile 1 zu löschen und zu dekrementieren?

akz
quelle

Antworten:

139

Behalten Sie die Etiketten aus Ihrer Originaldatei wie folgt bei:

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

Wenn Sie Spalten mit den Namen x und y haben, können Sie diese folgendermaßen ansprechen:

df$x
df$y

Wenn Sie die erste Zeile tatsächlich aus einem data.frame löschen möchten, können Sie negative Indizes wie folgt verwenden:

df = df[-1,]

Wenn Sie eine Spalte aus einem data.frame löschen möchten, können Sie ihr NULL zuweisen:

df$x = NULL

Hier sind einige einfache Beispiele zum Erstellen und Bearbeiten eines data.frame in 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
quelle
3
Ich bin nicht sicher , ob es @akz klar ist: in header=Tder Tsteht für TRUE, so dass dieser Parameter R zu Last - Header sagt. Siehe ?read.tablefür Details.
Daroczig
Beachten Sie, dass wenn Sie einen einspaltigen Datenrahmen haben, schauen Sie sich bitte diese Antwort an - stackoverflow.com/a/3232770/4606130, wo Sie auch einen drop = FALSEbei negativer Indizierung
benötigen
28

Sie können eine negative Indizierung verwenden, um Zeilen zu entfernen, z.

dat <- dat[-1, ]

Hier ist ein Beispiel:

> 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

Das heißt, Sie haben möglicherweise mehr Probleme als nur das Entfernen der Beschriftungen, die in Zeile 1 gelandet sind. Es ist mehr als wahrscheinlich, dass R die Daten als Text interpretiert und von dort in Faktoren konvertiert hat. Überprüfen Sie, was str(foo), wo foosich Ihr Datenobjekt über die Datentypen befindet.

Es hört sich so an, als müssten Sie header = TRUEin Ihrem Anruf nur die Daten einlesen (vorausgesetzt, Sie lesen sie über read.table()oder einen ihrer Wrapper ein).

Gavin Simpson
quelle
13

Wahrscheinlich möchte niemand die erste Zeile wirklich entfernen. Wenn Sie also nach etwas Sinnvollem suchen, ist dies eine bedingte Auswahl

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

>> setNew<-set[!(set$length=="long" & set$E==0),]
user3495945
quelle
Dies ist eine Antwort auf eine Frage, die nicht gestellt wurde. Ich finde es verwirrender als zu helfen.
U. Windl
12

Obwohl ich der am häufigsten gewählten Antwort zustimme, gibt es hier eine andere Möglichkeit, alle Zeilen außer der ersten beizubehalten:

dat <- tail(dat, -1)

Dies kann auch mit dem dplyrPaket von Hadley Wickham erreicht werden.

dat <- dat %>% slice(-1)
EMcKinney
quelle
7

Ich bin kein Experte, aber das kann auch funktionieren,

dat <- dat[2:nrow(dat), ]
Bipul Mohanto
quelle
Eigentlich funktioniert das nicht, wenn nrow(dat) == 1: Dann das ursprüngliche Datum erhalten bleibt.
U. Windl
6

dat <- dat[-1, ]hat funktioniert, aber mein Datenrahmen wurde zerstört und in einen anderen Typ geändert. Musste stattdessen verwenden, dat <- data.frame(dat[-1, ])aber dies ist möglicherweise ein Sonderfall, da dieser Datenrahmen anfangs nur eine Spalte hatte.

Kardamom
quelle
Dies ist ein Kommentar, keine Antwort! Trotzdem konnte ich nicht reproduzieren.
U. Windl