2012-04-10 4 views
250

Mam ramkę danych R z 6 kolumnami i chcę utworzyć nową ramkę danych, która ma tylko trzy kolumny.Wyodrębnianie określonych kolumn z ramki danych

Zakładając moja ramka danych jest df i chcę, aby wyodrębnić kolumny A, B i E, jest to jedyna komenda mogę wymyślić:

data.frame(df$A,df$B,df$E) 

Czy jest bardziej zwarty sposób to zrobić ?

Odpowiedz

342

Tak, jest.

# data for reproducible example 
# (and to avoid confusion from trying to subset `stats::df`) 
df <- setNames(data.frame(as.list(1:5)), LETTERS[1:5]) 
# subset 
df[,c("A","B","E")] 
+2

Daje to błąd, że "obiekt typu" zamknięcie "nie podlega podzbiorowi". –

+19

@ArenCambre: wtedy twoja data.frame tak naprawdę nie nazywa się 'df'. 'df' jest także funkcją w pakiecie statystyk. –

+4

@ArenCambre: http://2.bp.blogspot.com/-XU9PduVhq-I/Um-Y6e19jZI/AAAAAAAADfI/PrmoFQexa5M/s1600/Book+last+page.jpg –

42

Istnieją dwa oczywiste wybory: Joshua Ulricha df[,c("A","B","E")] lub

df[,c(1,2,5)] 

jak w

> df <- data.frame(A=c(1,2),B=c(3,4),C=c(5,6),D=c(7,7),E=c(8,8),F=c(9,9)) 
> df 
    A B C D E F 
1 1 3 5 7 8 9 
2 2 4 6 7 8 9 
> df[,c(1,2,5)] 
    A B E 
1 1 3 8 
2 2 4 8 
> df[,c("A","B","E")] 
    A B E 
1 1 3 8 
2 2 4 8 
70

To jest rola funkcji subset():

> dat <- data.frame(A=c(1,2),B=c(3,4),C=c(5,6),D=c(7,7),E=c(8,8),F=c(9,9)) 
> subset(dat, select=c("A", "B")) 
    A B 
1 1 3 
2 2 4 
+0

Kiedy próbuję tego, z moimi danymi, pojawia się błąd: "Błąd w x [j]: niepoprawna lista typu indeksu dolnego" " Ale jeśli c (" A "," B ") nie jest listą , co to jest? –

+0

@Rafael_Espericueta Trudno odgadnąć bez oglądania twojego kodu ... Ale 'c (" A "," B ")' jest wektorem, a nie listą. –

+0

Konwertuje ramkę danych na listę. –

28

Używanie dplyr pakiet, jeśli data.frame nazywa df1:

library(dplyr) 

df1 %>% 
    select(A, B, E) 

To również może być napisany bez rury %>% jak:

select(df1, A, B, E) 
6

ponownie stosując dplyr, gdzie DF1 jest oryginalna ramka danych:

df2 <- subset(df1, select = c(1, 2, 5)) 
+3

To nie używa 'dplyr'. Używa 'base :: subset' i jest identyczna z [odpowiedź Stephana Laurenta] (https://stackoverflow.com/a/10086494/903061) z tą różnicą, że używasz numerów kolumn zamiast nazw kolumn. – Gregor

0

[ i podgrupa nie są substytutami:

[ zwraca wektor, jeśli wybrana jest tylko jedna kolumna.

df = data.frame(a="a",b="b")  

identical(
    df[,c("a")], 
    subset(df,select="a") 
) 

identical(
    df[,c("a","b")], 
    subset(df,select=c("a","b")) 
) 
+0

Nie, jeśli ustawisz "drop = FALSE". Przykład: 'df [, c (" a "), drop = F]' – untill

6

Można również użyć pakietu sqldf który wykonuje wybiera w ramkach danych R,:

df1 <- sqldf("select A, B, E from df")

ten daje na wyjściu ramki danych df1 z kolumn A, B, E.

2

Z jakiegoś powodu tylko

df[, (names(df) %in% c("A","B","E"))] 

pracował dla mnie. Wszystkie powyższe składnie dały "wybrane niezdefiniowane kolumny".