Konversi format kolom data.frame dari karakter ke faktor

153

Saya ingin mengubah format (kelas) dari beberapa kolom objek data.frame saya ( mydf) dari charactor ke faktor .

Saya tidak ingin melakukan ini ketika saya membaca file teks dengan read.table()fungsi.

Bantuan apa pun akan dihargai.

Rasoul
sumber
12
mydf $ myfavoritecolumn <- as.factor (mydf $ myfavoritecolumn)
tim riffe
Terima kasih! tapi saya punya masalah lain. Saya memiliki nama setiap kolom dalam larik karakter col_names []. Bagaimana saya bisa menggunakan perintah di atas (mydf $ col_names [i]) tidak berfungsi.
Rasoul
Adakah cara untuk melakukan ini secara otomatis untuk semua variabel karakter, seperti data.frame melakukannya dengan stringsAsFactors?
Etienne Low-Décarie
@ EtienneLow-Décarie: adil unclassdan gunakan data.framehasilnya,
IRTFM

Jawaban:

197

Hai, selamat datang di dunia R.

mtcars  #look at this built in data set
str(mtcars) #allows you to see the classes of the variables (all numeric)

#one approach it to index with the $ sign and the as.factor function
mtcars$am <- as.factor(mtcars$am)
#another approach
mtcars[, 'cyl'] <- as.factor(mtcars[, 'cyl'])
str(mtcars)  # now look at the classes

Ini juga berfungsi untuk karakter, tanggal, bilangan bulat dan kelas lainnya

Karena Anda baru mengenal R, saya sarankan Anda melihat kedua situs web ini:

Manual rujukan: http://cran.r-project.org/manuals.html

R Kartu referensi: http://cran.r-project.org/doc/contrib/Short-refcard.pdf

Tyler Rinker
sumber
Terima kasih! tapi saya punya masalah lain. Saya memiliki nama setiap kolom dalam larik karakter col_names []. Bagaimana saya bisa menggunakan perintah di atas (tidak mydf$col_names[i]juga mydf[,col_names[i]]tidak berfungsi.)
Rasoul
1
@Rasoul, mydf[, col_names]akan melakukan ini
DrDom
3
+1 untuk referensi. Ini adalah hal-hal dasar, yang boleh untuk ditanyakan, tetapi juga baik untuk menyadari pekerjaan luas yang telah dimasukkan ke dalam karya-karya ini (dan sejenisnya).
Roman Luštrik
84
# To do it for all names
df[] <- lapply( df, factor) # the "[]" keeps the dataframe structure
 col_names <- names(df)
# do do it for some names in a vector named 'col_names'
df[col_names] <- lapply(df[col_names] , factor)

Penjelasan. Semua dataframe adalah daftar dan hasil yang [digunakan dengan argumen bernilai banyak juga daftar, jadi perulangan daftar adalah tugas lapply. Tugas di atas akan membuat satu set daftar yang fungsi data.frame.[<-harus berhasil masuk kembali ke dalam kerangka data,df

Strategi lain adalah dengan mengonversi hanya kolom-kolom di mana jumlah item unik kurang dari beberapa kriteria, katakanlah lebih sedikit dari log jumlah baris sebagai contoh:

cols.to.factor <- sapply( df, function(col) length(unique(col)) < log10(length(col)) )
df[ cols.to.factor] <- lapply(df[ cols.to.factor] , factor)
IRTFM
sumber
Ini adalah solusi yang sangat bagus! Ini juga dapat bekerja dengan nomor kolom yang mungkin sangat berguna jika Anda ingin mengubah banyak tetapi tidak semua. Misalnya, col_nums <- c (1, 6, 7: 9, 21:23, 27:28, 30:31, 39, 49:55, 57) lalu df [, col_nums] <- lapply (df [, col_nums] , faktor).
WGray
Peringatan: solusi pertama tidak berhasil jika length(col_names)==1. Dalam hal itu, df[,col_names]secara otomatis diturunkan ke vektor alih-alih daftar panjang 1, dan kemudian lapplymencoba untuk beroperasi pada setiap entri daripada kolom secara keseluruhan. Ini dapat dicegah dengan menggunakan df[,col_names,drop=FALSE].
P Schnell
Itu poin yang bagus. Doa lain yang akan mempertahankan status daftar adalah untuk digunakan df[col_names].
IRTFM
27

Anda dapat menggunakan dplyr::mutate_if()untuk mengonversi semua kolom karakter atau dplyr::mutate_at()untuk memilih kolom karakter bernama ke faktor:

library(dplyr)

# all character columns to factor:
df <- mutate_if(df, is.character, as.factor)

# select character columns 'char1', 'char2', etc. to factor:
df <- mutate_at(df, vars(char1, char2), as.factor)
sbha
sumber
18

Jika Anda ingin mengubah semua variabel karakter di data.frame menjadi faktor setelah Anda memuat data, Anda bisa melakukannya seperti ini, ke data.frame bernama dat:

character_vars <- lapply(dat, class) == "character"
dat[, character_vars] <- lapply(dat[, character_vars], as.factor)

Ini menciptakan vektor yang mengidentifikasi kolom mana dari kelas character, lalu berlaku as.factoruntuk kolom tersebut.

Contoh data:

dat <- data.frame(var1 = c("a", "b"),
                  var2 = c("hi", "low"),
                  var3 = c(0, 0.1),
                  stringsAsFactors = FALSE
                  )
Sam Firke
sumber
Konversi lengkap dari setiap variabel karakter ke faktor biasanya terjadi ketika membaca data, misalnya dengan stringsAsFactors = TRUE, tetapi ini berguna ketika mengatakan, Anda sudah membaca data dengan read_excel()dari readxlpaket dan ingin melatih model hutan acak yang tidak menerima variabel karakter.
Sam Firke
13

Cara singkat lain yang bisa Anda gunakan adalah pipa ( %<>%) dari paket magrittr . Ini mengubah karakter kolom MyColumn untuk faktor.

library(magrittr)

mydf$mycolumn %<>% factor
Chrimuelle
sumber
Harap edit dengan informasi lebih lanjut. Jawaban khusus kode dan "coba ini" tidak disarankan, karena tidak mengandung konten yang dapat ditelusuri, dan jangan jelaskan mengapa seseorang harus "mencoba ini". Kami berusaha di sini untuk menjadi sumber pengetahuan.
Brian Tompsett - 汤 莱恩
tolong jika saya tidak ingin menggunakannya untuk semua kolom df saya?
Mostafa
5

Saya sudah melakukannya dengan fungsi. Dalam hal ini saya hanya akan mengubah variabel karakter menjadi faktor:

for (i in 1:ncol(data)){
    if(is.character(data[,i])){
        data[,i]=factor(data[,i])
    }
}
pengguna3397644
sumber
Saya percaya Anda membutuhkan tanda kurung ganda untuk mengekstrak kolom dan mengubahnya menjadi faktor, misalnya[[i]]
RTrain3k