Bir veri çerçevesinden belirli sütunları çıkarma


365

6 Sütunlu bir R veri çerçevesi var ve yalnızca üç sütun içeren yeni bir veri çerçevesi oluşturmak istiyorum.

Benim veri çerçevesini varsayarsak olduğunu df, ve ben özü sütunlar istiyorum A, Bve Ebu sadece ben anlamaya komuta geçerli:

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

Bunu yapmanın daha kompakt bir yolu var mı?

Yanıtlar:


156

Data.frame'iniz çağrılırsa dplyr paketini kullanarak df1:

library(dplyr)

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

Bu, %>%boru olmadan da yazılabilir :

select(df1, A, B, E)

2
Sorumu gönderdiğimden beri Tidyverse'ün önemli evrimi göz önüne alındığında, cevabı size değiştirdim.
Aren Cambre

4
Düzenli aralıktaki öfkeli değişim oranı göz önüne alındığında, bu kalıbı kullanmaya karşı dikkatli olurum. Bu, sütun adlarını işlevler, paketler veya uygulamalar için kod yazarken nesne adları gibi muameleye karşı güçlü tercihime ek olarak.
Joshua Ulrich

1
Bu cevabın gönderilmesinden bu yana dört yıldan fazla bir süre geçti ve kalıp değişmedi. Borulu ifadeler oldukça sezgisel olabilir, bu yüzden caziptirler.
Aren Cambre

bu alt kümeye nasıl başka bir komut yürütebilirim? Örneğin ben rowMean hesaplamak istiyorum: "df1%>% rowMeans (select (A, B, E))" çalışmıyor.
Ben

Sen gibi birlikte bir boru hattı zincirini olur: df1 %>% select(A, B, E) %>% rowMeans(.). %>%Yazarak borunun belgelerine bakın?magrittr::`%>%`
Sam Firke

448

Sütun adlarının bir vektörünü kullanarak alt küme oluşturabilirsiniz. Bu yaklaşımı subset(), özellikle isimler , paketler veya uygulamalarda programlama yaparken, sütun adlarına nesne adları gibi davrananları tercih ederim .

# 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
Bu hatayı verir object of type 'closure' is not subsettable.
Aren Cambre

24
@ArenCambre: o zaman data.frame'iniz gerçekten adlandırılmamıştır df. dfaynı zamanda istatistik paketindeki bir işlevdir.
Joshua Ulrich


2
@Cina: Çünkü -"A"bir sözdizimi hatası. Ve ?Extract"der i, j, ...ayrıca seçim dışında bırakmak elemanları / dilimleri gösteren negatif tamsayılar, olabilir."
Joshua Ulrich

7
Sadece bir sütun R ayıklamak bile, bir dataframe yerine bir vektör döner ve bu istenmeyen olabilir çünkü bu sözdizimi ile ilgili bir sorun vardır: > df[,c("A")] [1] 1. Kullanmanın subsetbu dezavantajı yoktur.
David Dorchies

100

Bu subset()işlevin rolüdür :

> 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

Bunu denediğimde, verilerimle şu hatayı alıyorum: "x [j] hatası: geçersiz alt simge türü 'liste'" Ama c ("A", "B") bir liste değilse, bu nedir ?
Rafael_Espericueta

@Rafael_Espericueta Kodunuzu görüntülemeden tahmin etmek zor ... Ama c("A", "B")bir vektör, bir liste değil.
Stéphane Laurent

Veri çerçevesini listeye dönüştürür.
Suat Atan Doktora

78

İki belirgin seçenek vardır: Joshua Ulrich'in df[,c("A","B","E")]veya

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

de olduğu gibi

> 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

Sadece bir nedenle

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

benim için çalıştı. Yukarıdaki sözdizimlerinin tümü "tanımsız sütunlar seçildi" sonucunu verdi.



14

sqldfR veri çerçevelerinde seçim yapan paketi şu şekilde de kullanabilirsiniz :

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

Bu çıktı olarak df1A, B, E sütunlarına sahip bir veri çerçevesi sağlar .



1
df<- dplyr::select ( df,A,B,C)

Ayrıca, yeni oluşturulan verilere farklı bir ad atayabilirsiniz

data<- dplyr::select ( df,A,B,C)

0

[ ve altkümeler ikame edilemez:

[ yalnızca bir sütun seçildiğinde bir vektör döndürür.

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
Ayarladıysanız olmaz drop=FALSE. Örnek:df[,c("a"),drop=F]
e kadar
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.