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?

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)

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")]

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

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

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”.


15

Gdzie df1 jest twoją oryginalną ramką danych:

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

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.



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)

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"))
)

4
Nie, jeśli ustawisz drop=FALSE. Przykład:df[,c("a"),drop=F]
do
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.