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?

Aren Cambre
sumber

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)
Sam Firke
sumber
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")]
Joshua Ulrich
sumber
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
Stéphane Laurent
sumber
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
Henry
sumber
16

Hanya untuk beberapa alasan

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

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

so860
sumber
15

Di mana df1 adalah bingkai data asli Anda:

df2 <- subset(df1, select = c(1, 2, 5))
Richard Ball
sumber
7
Ini tidak digunakan dplyr. Itu menggunakan base::subset, dan identik dengan jawaban Stephane Laurent kecuali bahwa Anda menggunakan nomor kolom bukan nama kolom.
Gregor Thomas
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.

Aman Burman
sumber
2

Anda bisa menggunakan with:

with(df, data.frame(A, B, E))
Moody_Mudskipper
sumber
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)
Mohamed Rahouma
sumber
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"))
)
fxi
sumber
4
Tidak jika Anda mengatur drop=FALSE. Contoh:df[,c("a"),drop=F]
hingga