Saya punya masalah menggunakan data.table: Bagaimana cara mengonversi kelas kolom? Berikut ini contoh sederhananya: Dengan data.frame saya tidak memiliki masalah untuk mengubahnya, dengan data.table saya tidak tahu caranya:
df <- data.frame(ID=c(rep("A", 5), rep("B",5)), Quarter=c(1:5, 1:5), value=rnorm(10))
#One way: http://stackoverflow.com/questions/2851015/r-convert-data-frame-columns-from-factors-to-characters
df <- data.frame(lapply(df, as.character), stringsAsFactors=FALSE)
#Another way
df[, "value"] <- as.numeric(df[, "value"])
library(data.table)
dt <- data.table(ID=c(rep("A", 5), rep("B",5)), Quarter=c(1:5, 1:5), value=rnorm(10))
dt <- data.table(lapply(dt, as.character), stringsAsFactors=FALSE)
#Error in rep("", ncol(xi)) : invalid 'times' argument
#Produces error, does data.table not have the option stringsAsFactors?
dt[, "ID", with=FALSE] <- as.character(dt[, "ID", with=FALSE])
#Produces error: Error in `[<-.data.table`(`*tmp*`, , "ID", with = FALSE, value = "c(1, 1, 1, 1, 1, 2, 2, 2, 2, 2)") :
#unused argument(s) (with = FALSE)
Apakah saya melewatkan sesuatu yang jelas di sini?
Pembaruan karena posting Matthew: Saya menggunakan versi yang lebih lama sebelumnya, tetapi bahkan setelah memperbarui ke 1.6.6 (versi yang saya gunakan sekarang) saya masih mendapatkan kesalahan.
Pembaruan 2: Katakanlah saya ingin mengonversi setiap kolom dari kelas "faktor" ke kolom "karakter", tetapi tidak tahu sebelumnya kolom mana dari kelas yang mana. Dengan data.frame, saya dapat melakukan hal berikut:
classes <- as.character(sapply(df, class))
colClasses <- which(classes=="factor")
df[, colClasses] <- sapply(df[, colClasses], as.character)
Bisakah saya melakukan sesuatu yang serupa dengan data.table?
Pembaruan 3:
sessionInfo () R versi 2.13.1 (2011-07-08) Platform: x86_64-pc-mingw32 / x64 (64-bit)
locale:
[1] C
attached base packages:
[1] stats graphics grDevices utils datasets methods base
other attached packages:
[1] data.table_1.6.6
loaded via a namespace (and not attached):
[1] tools_2.13.1
sumber
data.table
metode berbeda dari yang ada untukdata.frame
#Produces error
. Tetap +1. Saya tidak mendapatkan kesalahan apa pun, versi mana yang Anda miliki? Ada masalah di area ini meskipun, ini telah diangkat sebelumnya, FR # 1224 dan FR # 1493 adalah prioritas tinggi untuk diatasi. Namun, jawaban Andrie adalah cara terbaik.invalid times argument
kesalahan itu? Bekerja dengan baik untuk saya. Versi mana yang kamu punyaJawaban:
Untuk satu kolom:
Menggunakan
lapply
danas.character
:sumber
convcols
kolom.dt[,lapply(.SD,as.numeric),.SDcols=convcols]
hampir instan sementaradt[,convcols:=lapply(.SD,as.numeric),.SDcols=convcols]
hampir macet R, jadi saya rasa saya salah melakukannya. Terima kasihset()
misalnyafor (col in names_factors) set(dt, j=col, value=as.factor(dt[[col]]))
[kutipan akhir]Coba ini
sumber
Filter
fungsi untuk mengidentifikasi kolom, misalnya:changeCols<- names(Filter(is.character, DT))
changeCols <- names(DT)[sapply(DT, is.character)]
.Mengangkat komentar Matt Dowle untuk jawaban Geneorama ( https://stackoverflow.com/a/20808945/4241780 ) agar lebih jelas (seperti yang dianjurkan), Anda dapat menggunakan
for(...)set(...)
.Dibuat pada 2020-02-12 oleh paket reprex (v0.3.0)
Lihat komentar Matt lainnya di https://stackoverflow.com/a/33000778/4241780 untuk info lebih lanjut.
Edit.
Seperti dicatat oleh Espen dan in
help(set)
,j
mungkin "Nama kolom (karakter) atau angka (bilangan bulat) yang akan diberi nilai ketika kolom sudah ada". Begitunames_factors <- c(1L, 3L)
juga akan berhasil.sumber
names_factors
ada di sini. Saya kira itu diambil dari stackoverflow.com/a/20808945/1666063 jadinames_factors = c('fac1', 'fac2')
dalam kasus ini - yang merupakan nama kolom. Tapi bisa juga nomor kolom misalnya 1; ncol (dt) yang akan mengonversi semua kolomIni cara yang BURUK untuk melakukannya! Saya hanya meninggalkan jawaban ini jika jawaban itu menyelesaikan masalah aneh lainnya. Metode yang lebih baik ini mungkin sebagian hasil dari versi data.table yang lebih baru ... jadi ada baiknya untuk mendokumentasikan dengan cara yang sulit ini. Plus, ini adalah contoh sintaks yang bagus untuk
eval
substitute
sintaks.yang memberi Anda
sumber
set()
misalnyafor (col in names_factors) set(dt, j=col, value=as.factor(dt[[col]]))
set
lebih tepat.for(...)set(...)
sini: stackoverflow.com/a/33000778/403310Saya mencoba beberapa pendekatan.
, atau sebaliknya
sumber
Saya memberikan cara yang lebih umum dan lebih aman untuk melakukan hal ini,
Fungsi
..
tersebut memastikan kita mendapatkan variabel dari ruang lingkup data.table; set_colclass akan mengatur kelas cols Anda. Anda bisa menggunakannya seperti ini:sumber
Jika Anda memiliki daftar nama kolom di data.table, Anda ingin mengubah kelas do:
sumber
dt[, c(convert_to_character) := lapply(.SD, as.character), .SDcols=convert_to_character]
untuk menetapkan dengan referensi, daripada menggunakan tugas data.frame yang lebih lambat.mencoba:
sumber