Saya mencoba menginisialisasi data.frame tanpa baris. Pada dasarnya, saya ingin menentukan tipe data untuk setiap kolom dan menamainya, tetapi hasilnya tidak ada baris yang dibuat.
Yang terbaik yang bisa saya lakukan sejauh ini adalah sesuatu seperti:
df <- data.frame(Date=as.Date("01/01/2000", format="%m/%d/%Y"),
File="", User="", stringsAsFactors=FALSE)
df <- df[-1,]
Yang membuat data.frame dengan satu baris berisi semua tipe data dan nama kolom yang saya inginkan, tetapi juga membuat baris yang tidak berguna yang kemudian perlu dihapus.
Apakah ada cara yang lebih baik untuk melakukan ini?
data.frame
telah mengetik kolom, jadi ya, jika Anda ingin menginisialisasi,data.frame
Anda harus menentukan jenis kolom ...data.frame
tidak benar-benar membatasi "primitif" dari jenis kolom (misalnya, Anda dapat menambahkan kolom tanggal atau bahkan kolom yang berisi daftar elemen). Selain itu, pertanyaan ini bukan referensi absolut, karena misalnya jika Anda tidak menentukan jenis kolom yang benar, Anda tidak akan memblokir tambahan baris tambahan yang memiliki kolom dari jenis yang berbeda ... jadi, saya akan menambahkan catatan, tetapi tidak contoh dengan semua tipe primitif karena tidak mencakup semua kemungkinan ...data.frame(Doubles=rep(as.double(NA),numberOfRow), Ints=rep(as.integer(NA),numberOfRow))
Jika Anda sudah memiliki bingkai data yang ada , katakanlah
df
yang memiliki kolom yang Anda inginkan, maka Anda bisa membuat bingkai data kosong dengan menghapus semua baris:Perhatikan bahwa
df
masih berisi data, tetapiempty_df
tidak.Saya menemukan pertanyaan ini mencari cara membuat contoh baru dengan baris kosong, jadi saya pikir ini mungkin bermanfaat bagi sebagian orang.
sumber
df[NA,]
ini akan mempengaruhi indeks juga (yang tidak mungkin seperti yang Anda inginkan), saya akan menggunakandf[TRUE,] = NA
; Namun perhatikan bahwa ini akan menimpa yang asli. Anda harus menyalin kerangka data terlebih dahulucopy_df = data.frame(df)
dan kemudiancopy_df[TRUE,] = NA
empty_df
withempty_df[0:nrow(df),] <- NA
.Anda dapat melakukannya tanpa menentukan jenis kolom
sumber
Anda dapat menggunakan
read.table
dengan string kosong untuk inputtext
sebagai berikut:Cara lainnya menentukan
col.names
string:Terima kasih kepada Richard Scriven untuk perbaikannya
sumber
read.table(text = "", ...)
Anda tidak perlu secara eksplisit membuka koneksi.read.csv
Pendekatan juga bekerja denganreadr::read_csv
, seperti dalamread_csv("Date,File,User\n", col_types = "Dcc")
. Dengan cara ini Anda dapat langsung membuat tibble kosong dari struktur yang diperlukan.Cara paling efisien untuk melakukan ini adalah menggunakan
structure
untuk membuat daftar yang memiliki kelas"data.frame"
:Untuk menempatkan ini dalam perspektif dibandingkan dengan jawaban yang saat ini diterima, berikut ini adalah tolok ukur sederhana:
sumber
data.table
biasanya berisi.internal.selfref
atribut, yang tidak dapat dipalsukan tanpa memanggildata.table
fungsi. Apakah Anda yakin tidak mengandalkan perilaku tidak berdokumen di sini?data.table
dan berasumsi bahwa Google memang menemukan apa yang saya inginkan dan semua yang ada di sinidata.table
terkait.data.frame()
memberikan cek untuk penamaan, nama pengguna, dll.Nyatakan saja
ketika Anda mencoba ke
rbind
baris pertama itu akan membuat kolomsumber
rbind
ini akan bekerja dengan baik, jika tidak ...rbind()
.Jika Anda mencari kekurangan:
jadi Anda tidak perlu menentukan nama kolom secara terpisah. Anda mendapatkan tipe kolom default logis sampai Anda mengisi bingkai data.
sumber
Error in data.frame(..., check.names = FALSE) : arguments imply differing number of rows: 0, 2
Saya membuat bingkai data kosong menggunakan kode berikut
dan mencoba mengikat beberapa baris untuk mengisi yang sama sebagai berikut.
tetapi mulai memberikan nama kolom yang salah sebagai berikut
Solusi untuk ini adalah untuk mengkonversi newrow ke tipe df sebagai berikut
sekarang memberikan bingkai data yang benar ketika ditampilkan dengan nama kolom sebagai berikut
sumber
Untuk membuat bingkai data kosong , masukkan jumlah baris dan kolom yang diperlukan ke fungsi berikut:
Untuk membuat bingkai kosong sambil menentukan kelas setiap kolom , cukup lewati vektor tipe data yang diinginkan ke dalam fungsi berikut:
Gunakan sebagai berikut:
Pemberian yang mana:
Untuk mengkonfirmasi pilihan Anda, jalankan yang berikut:
sumber
Jika Anda ingin membuat bingkai data kosong dengan nama dinamis (nama dalam variabel), ini dapat membantu:
Anda dapat mengubah jenisnya juga jika Anda membutuhkannya. Suka:
sumber
Jika Anda tidak keberatan tidak menentukan tipe data secara eksplisit, Anda dapat melakukannya dengan cara ini:
sumber
Dengan Menggunakan,
data.table
kami dapat menentukan tipe data untuk setiap kolom.sumber
Jika Anda ingin mendeklarasikannya
data.frame
dengan banyak kolom, mungkin akan merepotkan untuk mengetikkan semua kelas kolom dengan tangan. Terutama jika Anda dapat memanfaatkannyarep
, pendekatan ini mudah dan cepat (sekitar 15% lebih cepat daripada solusi lain yang dapat digeneralisasi seperti ini):Jika kelas kolom yang Anda inginkan dalam vektor
colClasses
, Anda dapat melakukan hal berikut:lapply
akan menghasilkan daftar panjang yang diinginkan, setiap elemen yang hanya berupa vektor diketik kosong sepertinumeric()
atauinteger()
.setDF
mengonversinyalist
dengan mengacu pada adata.frame
.setnames
menambahkan nama yang diinginkan dengan referensi.Perbandingan kecepatan:
Ini juga lebih cepat daripada menggunakan
structure
dengan cara yang serupa:sumber
Katakanlah nama kolom Anda dinamis, Anda dapat membuat matriks bernama baris kosong dan mengubahnya menjadi bingkai data.
sumber
Pertanyaan ini tidak secara khusus membahas masalah saya (dijelaskan di sini ) tetapi jika ada orang yang ingin melakukan ini dengan jumlah kolom parameter dan tanpa paksaan:
Seperti yang divibisan nyatakan pada pertanyaan terkait,
sumber
Jika Anda sudah memiliki kerangka data, Anda dapat mengekstrak metadata (nama kolom dan jenis) dari kerangka data (misalnya jika Anda mengendalikan BUG yang hanya dipicu dengan input tertentu dan memerlukan kerangka Data boneka kosong):
Dan kemudian gunakan
read.table
untuk membuat kerangka data kosongsumber