Wyodrębnianie określonych kolumn z ramki danych

365

Mam ramkę danych R z 6 kolumnami i chcę utworzyć nową ramkę danych, która ma tylko trzy kolumny.

Zakładając mój ramkę danych jest dfi chcę, aby wyodrębnić kolumn A, BorazE jest to tylko dowodzić mogę dowiedzieć się:

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

Czy istnieje bardziej kompaktowy sposób na zrobienie tego?

Aren Cambre
źródło

Odpowiedzi:

156

Korzystając z pakietu dplyr , jeśli twoja data.frame nazywa się df1:

library(dplyr)

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

Można to również zapisać bez %>%potoku, ponieważ:

select(df1, A, B, E)
Sam Firke
źródło
2
Biorąc pod uwagę znaczną ewolucję Tidyverse od czasu opublikowania mojego pytania, zmieniłem odpowiedź na ciebie.
Aren Cambre
4
Biorąc pod uwagę wściekłą szybkość zmian w porządku, odradzam stosowanie tego wzorca. Jest to dodatek do mojej zdecydowanej woli traktowania nazw kolumn tak, jakby były nazwami obiektów podczas pisania kodu dla funkcji, pakietów lub aplikacji.
Joshua Ulrich
1
Minęły ponad cztery lata od przesłania tej odpowiedzi, a wzór się nie zmienił. Wyrażenia potokowe mogą być dość intuicyjne, dlatego są atrakcyjne.
Aren Cambre
jak wykonać kolejne polecenie dla tego podzbioru? Np. Chcę obliczyć element rowMean: „df1%>% rowMeans (select (A, B, E))” nie działa.
Ben
Można by łańcuch razem rurociągu jak: df1 %>% select(A, B, E) %>% rowMeans(.). Zobacz dokumentację %>%fajki, wpisując?magrittr::`%>%`
Sam Firke
448

Możesz dokonać podzbioru za pomocą wektora nazw kolumn. Zdecydowanie wolę to podejście od tych, które traktują nazwy kolumn tak, jakby były nazwami obiektów (np. subset()), Szczególnie podczas programowania w funkcjach, pakietach lub aplikacjach.

# 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")]
Joshua Ulrich
źródło
4
To daje błąd object of type 'closure' is not subsettable.
Aren Cambre,
24
@ArenCambre: wtedy twoja data.frame nie jest tak naprawdę nazwana df. dfjest również funkcją pakietu statystyk.
Joshua Ulrich,
2
@Cina: Ponieważ -"A"jest to błąd składniowy. I ?Extractmówi: „ , może być także ujemne liczby całkowite, wskazując elementy / plasterków zostawić z wyboru.” ij...
Joshua Ulrich
7
Nie ma problemu z tej składni, ponieważ jeśli mamy wyodrębnić tylko jedna kolumna R, zwraca wektor zamiast dataframe i to może być niechciana: > df[,c("A")] [1] 1. Korzystanie subsetnie ma tej wady.
David Dorchies
100

Oto rola subset()funkcji:

> 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
Stéphane Laurent
źródło
Gdy próbuję tego z moimi danymi, pojawia się błąd: „Błąd w x [j]: niepoprawny typ listy indeksów„ lista ”” Ale jeśli c („A”, „B”) nie jest listą, co to jest ?
Rafael_Espericueta
@Rafael_Espericueta Trudno zgadnąć bez oglądania kodu ... Ale c("A", "B")to wektor, a nie lista.
Stéphane Laurent,
Konwertuje ramkę danych na listę.
Dr Suat Atan
78

Istnieją dwie oczywiste opcje: Joshua Ulrich 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
Henz
źródło
16

Tylko z jakiegoś powodu

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

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

so860
źródło
15

Gdzie df1 jest twoją oryginalną ramką danych:

df2 <- subset(df1, select = c(1, 2, 5))
Richard Ball
źródło
7
To nie używa dplyr. Wykorzystuje base::subseti jest identyczny z odpowiedzią Stephane Laurenta, tyle że używa się numerów kolumn zamiast nazw kolumn.
Gregor Thomas
14

Możesz także użyć sqldfpakietu, który wykonuje selekcje na ramkach danych R jako:

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

Daje to jako wyjście ramkę danych df1z kolumnami: A, B, E.

Aman Burman
źródło
2

Możesz użyć with:

with(df, data.frame(A, B, E))
Moody_Mudskipper
źródło
1
df<- dplyr::select ( df,A,B,C)

Możesz także przypisać inną nazwę do nowo utworzonych danych

data<- dplyr::select ( df,A,B,C)
Mohamed Rahouma
źródło
0

[ i podzbiorów nie można zastępować:

[ 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"))
)
fxi
źródło
4
Nie, jeśli ustawisz drop=FALSE. Przykład:df[,c("a"),drop=F]
do