Jak usunąć pierwszy wiersz ramki danych w R?

85

Mam zbiór danych z 11 kolumnami, z których każda zawiera ponad 1000 wierszy. Kolumny były oznaczone V1, V2, V11 itd. Zastąpiłem te nazwy czymś bardziej użytecznym dla mnie używając polecenia "c". Nie zdawałem sobie sprawy, że wiersz 1 zawiera również etykiety dla każdej kolumny, a moje rzeczywiste dane zaczynają się w wierszu 2.

Czy istnieje sposób na usunięcie wiersza 1 i zmniejszenie?

akz
źródło

Odpowiedzi:

139

Zachowaj etykiety z oryginalnego pliku w ten sposób:

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

Jeśli masz kolumny o nazwach x i y, możesz je rozwiązać w ten sposób:

df$x
df$y

Jeśli chcesz faktycznie usunąć pierwszy wiersz z data.frame, możesz użyć indeksów ujemnych w następujący sposób:

df = df[-1,]

Jeśli chcesz usunąć kolumnę z data.frame, możesz przypisać do niej NULL:

df$x = NULL

Oto kilka prostych przykładów tworzenia i manipulowania ramką data.frame w 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
źródło
3
Nie jestem pewien, czy to jasne @akz: w oznacza , więc ten parametr mówi R do nagłówka obciążenia. Zobacz szczegóły. header=TTTRUE?read.table
daroczig
Zwróć uwagę, że jeśli masz ramkę danych z pojedynczą kolumną, spójrz na tę odpowiedź - stackoverflow.com/a/3232770/4606130, gdzie będziesz potrzebować drop = FALSErównież podczas indeksowania ujemnego
micstr
28

Możesz użyć indeksowania negatywnego, aby usunąć wiersze, np .:

dat <- dat[-1, ]

Oto przykład:

> 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

To powiedziawszy, możesz mieć więcej problemów niż tylko usunięcie etykiet, które znalazły się w wierszu 1. Jest bardziej prawdopodobne, że R zinterpretował dane jako tekst, a następnie przekształcił je w czynniki. Sprawdź, co str(foo)i gdzie foojest twój obiekt danych mówi o typach danych.

Wygląda na to, że wystarczy header = TRUEw wywołaniu odczytać dane (zakładając, że odczytujesz je za pośrednictwem read.table()lub jednej z opakowań).

Gavin Simpson
źródło
13

Prawdopodobnie nikt nie chce usunąć pierwszego wiersza. Jeśli więc szukasz czegoś znaczącego, to jest to selekcja warunkowa

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

>> setNew<-set[!(set$length=="long" & set$E==0),]
user3495945
źródło
To jest odpowiedź na pytanie, które nie zostało zadane. Myślę, że to bardziej zagmatwane niż pomaganie.
U. Windl
12

Chociaż zgadzam się z najczęściej głosowaną odpowiedzią, oto inny sposób zachowania wszystkich wierszy oprócz pierwszego:

dat <- tail(dat, -1)

Można to również osiągnąć za pomocą dplyrpakietu Hadley Wickham .

dat <- dat %>% slice(-1)
EMcKinney
źródło
7

Nie jestem ekspertem, ale to też może działać,

dat <- dat[2:nrow(dat), ]
Bipul Mohanto
źródło
Właściwie to nie działa, gdy nrow(dat) == 1: Następnie zachowywana jest oryginalna data.
U. Windl
6

dat <- dat[-1, ]zadziałało, ale zabiło moją ramkę danych, zmieniając ją na inny typ. Musiałem zamiast tego użyć, dat <- data.frame(dat[-1, ])ale jest to prawdopodobnie szczególny przypadek, ponieważ ta ramka danych początkowo miała tylko jedną kolumnę.

kardamon
źródło
To jest komentarz, a nie odpowiedź! Mimo to nie mogłem się rozmnażać.
U. Windl