Mengekstrak kolom tertentu dari bingkai data


366

Saya memiliki bingkai data R dengan 6 kolom, dan saya ingin membuat kerangka data baru yang hanya memiliki tiga kolom.

Dengan asumsi frame data saya df, dan saya ingin kolom ekstrak A, Bdan E, ini adalah satu-satunya perintah saya bisa mengetahui:

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

Apakah ada cara yang lebih ringkas untuk melakukan ini?

Jawaban:


157

Menggunakan dplyr paket , jika data.frame Anda dipanggil df1:

library(dplyr)

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

Ini juga dapat ditulis tanpa %>%pipa sebagai:

select(df1, A, B, E)

2
Mengingat evolusi yang luar biasa dari Tidyverse sejak memposting pertanyaan saya, saya telah mengalihkan jawaban kepada Anda.
Aren Cambre

4
Mengingat tingkat perubahan yang sangat besar di tidyverse, saya akan berhati-hati untuk tidak menggunakan pola ini. Ini di samping preferensi kuat saya terhadap memperlakukan nama kolom seolah-olah mereka adalah nama objek ketika menulis kode untuk fungsi, paket, atau aplikasi.
Joshua Ulrich

1
Sudah lebih dari empat tahun sejak jawaban ini diajukan, dan polanya tidak berubah. Ekspresi piped bisa sangat intuitif, itulah sebabnya mereka menarik.
Aren Cambre

bagaimana cara menjalankan perintah lebih lanjut ke subset ini? Misalnya saya ingin menghitung rowMean: "df1%>% rowMeans (pilih (A, B, E))" tidak berfungsi.
Ben

Anda akan lebih rantai bersama pipa seperti: df1 %>% select(A, B, E) %>% rowMeans(.). Lihat dokumentasi untuk %>%pipa dengan mengetik?magrittr::`%>%`
Sam Firke

448

Anda dapat subset menggunakan vektor nama kolom. Saya sangat suka pendekatan ini daripada mereka yang memperlakukan nama kolom seolah-olah mereka adalah nama objek (misalnya subset()), terutama ketika pemrograman dalam fungsi, paket, atau aplikasi.

# 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
Itu memberi kesalahan object of type 'closure' is not subsettable.
Aren Cambre

24
@ArenCambre: maka data.frame Anda tidak benar-benar bernama df. dfjuga merupakan fungsi dalam paket statistik.
Joshua Ulrich


2
@Cina: Karena -"A"ini adalah kesalahan sintaksis. Dan ?Extractmengatakan, " , juga bisa bilangan bulat negatif, menunjukkan unsur-unsur / irisan meninggalkan keluar dari seleksi." ij...
Joshua Ulrich

7
Ada masalah dengan sintaks ini karena jika kita mengambil hanya satu kolom R, mengembalikan vektor bukan dataframe dan ini bisa menjadi tidak diinginkan: > df[,c("A")] [1] 1. Menggunakan subsettidak memiliki kelemahan ini.
David Dorchies

101

Ini adalah peran dari subset()fungsi:

> 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

Ketika saya mencoba ini, dengan data saya, saya mendapatkan kesalahan: "Kesalahan di x [j]: 'daftar' jenis subskrip tidak valid" Tetapi jika c ("A", "B") bukan daftar, apa itu ?
Rafael_Espericueta

@Rafael_Espericueta Sulit ditebak tanpa melihat kode Anda ... Tapi c("A", "B")ini vektor, bukan daftar.
Stéphane Laurent

Itu mengkonversi bingkai data ke daftar.
Suat Atan PhD

78

Ada dua pilihan yang jelas: Joshua Ulrich df[,c("A","B","E")]atau

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

seperti dalam

> 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

Hanya untuk beberapa alasan

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

bekerja untukku. Semua sintaksis di atas menghasilkan "kolom tidak terdefinisi terpilih".



14

Anda juga dapat menggunakan sqldfpaket yang melakukan pemilihan pada bingkai data R sebagai:

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

Ini memberikan sebagai output frame data df1dengan kolom: A, B, E.



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

Anda juga dapat menetapkan nama yang berbeda untuk data yang baru dibuat

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

0

[ dan subset tidak dapat diganti:

[ mengembalikan vektor jika hanya satu kolom yang dipilih.

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
Tidak jika Anda mengatur drop=FALSE. Contoh:df[,c("a"),drop=F]
hingga
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.