Saya memiliki bingkai data R yang berisi faktor yang ingin saya "kembangkan" sehingga untuk setiap tingkat faktor, ada kolom terkait dalam bingkai data baru, yang berisi indikator 1/0. Misal, misalkan saya memiliki:
df.original <-data.frame(eggs = c("foo", "foo", "bar", "bar"), ham = c(1,2,3,4))
Saya ingin:
df.desired <- data.frame(foo = c(1,1,0,0), bar=c(0,0,1,1), ham=c(1,2,3,4))
Karena untuk analisis tertentu yang memerlukan kerangka data numerik lengkap (misalnya, analisis komponen utama), saya pikir fitur ini mungkin sudah ada di dalamnya. Menulis fungsi untuk melakukan ini seharusnya tidak terlalu sulit, tetapi saya dapat memperkirakan beberapa tantangan yang berkaitan dengan nama kolom dan jika sudah ada sesuatu, saya lebih suka menggunakannya.
cast
saya gunakan .?formula
juga?model.matrix
, tetapi tidak jelas (mungkin saja karena kurangnya kedalaman pengetahuan saya dalam aljabar matriks dan formulasi model). Setelah menggali lebih lanjut, saya dapat menyimpulkan bahwa -1 hanya menentukan untuk tidak menyertakan kolom "intersep". Jika Anda membiarkan -1, Anda akan melihat kolom intersep 1 dalam output dengan satu kolom biner tersisa. Anda dapat melihat nilai mana dari kolom yang dihilangkan adalah 1 berdasarkan baris di mana nilai kolom lainnya adalah 0. Dokumentasinya tampak samar-adakah sumber lain yang bagus?model.matrix(~., data=iris)[,-1]
naresid
untuk mengembalikan nilai yang hilang setelah menggunakanna.exclude
. Contoh cepat:tmp <- data.frame(x=factor(c('a','b','c',NA,'a'))); tmp2 <- na.exclude(tmp); tmp3 <- model.matrix( ~x-1, tmp2); tmp4 <- naresid(attr(tmp2,'na.action'), tmp3)
Jika bingkai data Anda hanya terdiri dari faktor-faktor (atau Anda mengerjakan subset variabel yang semuanya merupakan faktor), Anda juga dapat menggunakan
acm.disjonctif
fungsi dariade4
paket:Tidak persis seperti kasus yang Anda gambarkan, tetapi ini juga bisa berguna ...
sumber
Cara cepat menggunakan
reshape2
paket:Perhatikan bahwa ini menghasilkan nama kolom yang Anda inginkan dengan tepat.
sumber
ham
adalah id baris unik. Jikaham
bukan sebuah id unik maka seseorang harus menggunakan id unik lainnya (atau membuat dummy) dan menggunakannya sebagai penggantiham
. Mengonversi label kategorikal menjadi indikator biner hanya masuk akal untuk id unik.mungkin variabel dummy mirip dengan yang Anda inginkan. Kemudian, model.matrix berguna:
sumber
Entri terlambat
class.ind
darinnet
paketsumber
Baru saja menemukan utas lama ini dan berpikir saya akan menambahkan fungsi yang menggunakan ade4 untuk mengambil kerangka data yang terdiri dari faktor dan / atau data numerik dan mengembalikan kerangka data dengan faktor sebagai kode dummy.
Ayo coba.
sumber
Berikut cara yang lebih jelas untuk melakukannya. Saya menggunakan model.matrix untuk membuat variabel boolean dummy dan kemudian menggabungkannya kembali ke dataframe asli.
sumber
Saya membutuhkan fungsi untuk 'meledakkan' faktor-faktor yang sedikit lebih fleksibel, dan membuatnya berdasarkan fungsi acm.disjonctif dari paket ade4. Ini memungkinkan Anda untuk memilih nilai yang meledak, yaitu 0 dan 1 dalam acm.disjonctif. Itu hanya meledakkan faktor-faktor yang memiliki level 'sedikit'. Kolom numerik dipertahankan.
sumber