Saya memiliki kumpulan data besar dan saya ingin membaca kolom tertentu atau menjatuhkan yang lainnya.
data <- read.dta("file.dta")
Saya memilih kolom yang saya tidak tertarik:
var.out <- names(data)[!names(data) %in% c("iden", "name", "x_serv", "m_serv")]
dan daripada saya ingin melakukan sesuatu seperti:
for(i in 1:length(var.out)) {
paste("data$", var.out[i], sep="") <- NULL
}
untuk menjatuhkan semua kolom yang tidak diinginkan. Apakah ini solusi optimal?
subset(data, select=c(...))
membantu dalam kasus saya untuk menjatuhkan vars. pertanyaannya terutama tentangpaste("data$",var.out[i],sep="")
bagian untuk mengakses kolom yang menarik di dalam loop. bagaimana saya bisa menempel atau entah bagaimana menulis nama kolom? Terima kasih kepada semua orang atas perhatian dan bantuan AndaJawaban:
Anda harus menggunakan pengindeksan atau
subset
fungsinya. Sebagai contoh :Kemudian Anda dapat menggunakan
which
fungsi dan-
operator dalam indeksasi kolom:Atau, lebih sederhana, gunakan
select
argumensubset
fungsi: Anda kemudian dapat menggunakan-
operator langsung pada vektor nama kolom, dan Anda bahkan dapat menghilangkan tanda kutip di sekitar nama!Perhatikan bahwa Anda juga dapat memilih kolom yang Anda inginkan daripada menjatuhkan yang lain:
sumber
select
argumen darisubset
fungsi melakukan pekerjaan yang sempurna! Juba terima kasih!which
tidak perlu, lihat jawaban Ista. Tetapi bagian dengan-
bagus! Tidak tahu itu!subset
terlihat bagus, tetapi cara itu diam-diam menjatuhkan nilai yang hilang tampaknya cukup berbahaya bagi saya.subset
memang sangat nyaman, tetapi ingatlah untuk menghindari menggunakannya kecuali jika Anda menggunakan R secara interaktif. Lihat Peringatan dalam dokumentasi fungsi dan pertanyaan SO ini untuk lebih lanjut.Jangan gunakan
-which()
untuk ini, ini sangat berbahaya. Mempertimbangkan:Alih-alih gunakan subset atau
!
fungsi:Saya telah belajar ini dari pengalaman yang menyakitkan. Jangan berlebihan
which()
!sumber
setdiff
juga berguna:setdiff(names(dat), c("foo", "bar"))
setdiff
proposal @hadley sangat baik untuk daftar panjang nama-nama.Pertama , Anda dapat menggunakan pengindeksan langsung (dengan vektor booleans) alih-alih mengakses kembali nama kolom jika Anda bekerja dengan bingkai data yang sama; itu akan lebih aman seperti yang ditunjukkan oleh Ista, dan lebih cepat untuk menulis dan mengeksekusi. Jadi yang Anda butuhkan hanyalah:
dan kemudian, cukup menetapkan kembali data:
Kedua , lebih cepat menulis, Anda dapat langsung menetapkan NULL ke kolom yang ingin Anda hapus:
Terakhir , Anda dapat menggunakan subset (), tetapi itu tidak benar-benar dapat digunakan dalam kode (bahkan file bantuan memperingatkannya). Secara khusus, masalah bagi saya adalah bahwa jika Anda ingin secara langsung menggunakan fitur drop dari susbset () Anda perlu menulis tanpa mengutip ekspresi yang sesuai dengan nama kolom:
Sebagai bonus , berikut ini adalah tolok ukur kecil dari opsi yang berbeda, yang dengan jelas menunjukkan bahwa himpunan bagian lebih lambat, dan bahwa metode pengalihan yang pertama lebih cepat:
Kode di bawah ini:
sumber
NULL
, tetapi mengapa ketika Anda memasukkan lebih dari dua nama diperlukan untuk menetapkannyalist(NULL)
? Saya hanya ingin tahu bagaimana cara kerjanya, karena saya mencoba hanya dengan satu nama dan saya tidak perlulist()
$
atau[[
), menggunakan<- list(NULL)
sebenarnya akan menyebabkan hasil yang salah. Jika Anda mengakses subset dari kerangka data dengan satu atau beberapa kolom,<- list(NULL)
adalah cara untuk pergi, bahkan jika itu tidak diperlukan untuk kerangka data satu kolom (karenadf['myColumns']
akan dicor ke vektor jika diperlukan).Anda juga dapat mencoba
dplyr
paket:sumber
dplyr::select(df2, -one_of(c('x','y')))
masih akan bekerja (dengan peringatan) bahkan jika beberapa kolom bernama tidak adaInilah solusi cepat untuk ini. Katakanlah, Anda memiliki kerangka data X dengan tiga kolom A, B dan C:
Jika saya ingin menghapus kolom, katakan B, cukup gunakan grep di nama coln untuk mendapatkan indeks kolom, yang kemudian dapat Anda gunakan untuk menghilangkan kolom.
Kerangka data X baru Anda akan terlihat seperti berikut (kali ini tanpa kolom B):
Keindahan grep adalah Anda dapat menentukan beberapa kolom yang cocok dengan ekspresi reguler. Jika saya memiliki X dengan lima kolom (A, B, C, D, E):
Keluarkan kolom B dan D:
EDIT: Mempertimbangkan saran grepl dari Matthew Lundberg dalam komentar di bawah ini:
Jika saya mencoba untuk menjatuhkan kolom yang tidak ada, tidak ada yang terjadi:
sumber
X[,-grep("B",colnames(X))]
tidak akan mengembalikan kolom dalam kasus di mana tidak ada nama kolom berisiB
, daripada mengembalikan semua kolom seperti yang diinginkan. Pertimbangkan denganX <- iris
misalnya. Ini adalah masalah dengan menggunakan indeks negatif dengan nilai yang dihitung. Pertimbangkangrepl
saja.Saya mencoba menghapus kolom saat menggunakan paket
data.table
dan mendapatkan hasil yang tidak terduga. Saya agak berpikir hal berikut ini layak untuk dikirim. Hanya sedikit peringatan.[Diedit oleh Matthew ...]
Pada dasarnya, sintaks untuk
data.table
TIDAK persis sama dengandata.frame
. Sebenarnya ada banyak perbedaan, lihat FAQ 1.1 dan FAQ 2.17. Anda telah diperingatkan!sumber
DT[,var.out := NULL]
untuk menghapus kolom yang ingin Anda lakukan.data.frame
dandata.table
kelasSaya mengubah kode menjadi:
Bagaimanapun, jawaban juba adalah solusi terbaik untuk masalah saya!
sumber
select
argumensubset
fungsi dalam kode saya. saya hanya ingin melihat bagaimana saya bisa mengakses kolom yang berubah-ubah dalam satu lingkaran jika saya ingin melakukan sesuatu yang lain daripada hanya menjatuhkan kolom. set data asli memiliki sekitar 1.200 vars dan saya hanya tertarik untuk menggunakan 4 dari mereka tanpa mengetahui di mana sebenarnya mereka.Berikut ini solusi lain yang mungkin bisa membantu orang lain. Kode di bawah ini memilih sejumlah kecil baris dan kolom dari kumpulan data besar. Kolom dipilih seperti dalam salah satu jawaban juba kecuali bahwa saya menggunakan fungsi tempel untuk memilih satu set kolom dengan nama yang diberi nomor secara berurutan:
sumber
sumber
Saya tidak dapat menjawab pertanyaan Anda di komentar karena skor reputasi rendah.
Kode selanjutnya akan memberi Anda kesalahan karena fungsi tempel mengembalikan string karakter
Berikut ini adalah solusi yang mungkin:
atau lakukan saja:
sumber
dfnum = df[,-c(8,9)]
sumber