Saya menggunakan R dan telah memuat data ke dalam dataframe menggunakan read.csv(). Bagaimana cara menentukan tipe data setiap kolom dalam bingkai data?
Pemrograman (misalnya sapply(..., class))atau interaktif (misalnya str(...)) atau keduanya? Ini umumnya lebih terukur untuk melakukannya pemrograman, maka Anda dapat sewenang-wenang Filter(...)daftar untuk bilangan bulat, karakter, faktor dll Atau Anda dapat menggunakan grep/grepluntuk mengambil kesimpulan kolom-jenis dari names(...)jika mereka mengikuti konvensi penamaan setiap
smci
@smci: Saya tidak meminta 'secara terprogram' dalam pertanyaan awal saya. Saya tidak tahu mengapa Anda akan mengubah seluruh sifat pertanyaan saya.
stackoverflowuser2010
ok, itu dibatalkan. Itu tidak mengubah seluruh sifat, itu mengklarifikasi di salah satu dari dua arah. Pendekatan interaktif menggunakan str(...)tidak scalable dan kehabisan tenaga pada <100 cols.
smci
Jawaban:
215
Taruhan terbaik Anda untuk memulai adalah menggunakan ?str(). Untuk menjelajahi beberapa contoh, mari kita buat beberapa data:
set.seed(3221)# this makes the example exactly reproducible
my.data <- data.frame(y=rnorm(5),
x1=c(1:5),
x2=c(TRUE,TRUE,FALSE,FALSE,FALSE),
X3=letters[1:5])
Solusi @Wilmer E Henao H sangat efisien:
sapply(my.data, class)
y x1 x2 X3
"numeric""integer""logical""factor"
Menggunakan str()memberi Anda informasi plus barang tambahan (seperti tingkat faktor Anda dan beberapa nilai pertama dari setiap variabel):
str(my.data)'data.frame':5 obs. of 4 variables:$ y : num 1.031.599-0.8180.872-2.682$ x1: int 12345$ x2: logi TRUETRUEFALSEFALSEFALSE$ X3: Factor w/5 levels "a","b","c","d",..:12345
Pendekatan @Gavin Simpson juga ramping, tetapi memberikan informasi yang sedikit berbeda dari class():
sapply(my.data, typeof)
y x1 x2 X3
"double""integer""logical""integer"
Setelah menggunakan R selama beberapa bulan, saya telah menemukan bahwa itu str(dataframe)adalah cara tercepat untuk menentukan jenis kolom secara sekilas. Pendekatan lain membutuhkan lebih banyak penekanan tombol dan tidak menunjukkan informasi sebanyak mungkin, tetapi mereka membantu jika tipe data kolom merupakan input ke fungsi lain.
stackoverflowuser2010
Hai, ketika saya melakukan hal yang sama dengan mendaftar, bukan mendaftar, itu tidak berhasil
Dom Jo
@ Tom, mengapa Anda menggunakan apply()? Itu untuk matriks. Kerangka data adalah daftar (jenis khusus).
gung - Reinstate Monica
50
sapply(yourdataframe, class)
Di mana bingkai data Anda adalah nama bingkai data yang Anda gunakan
jika Anda membutuhkan jenis aktual vektor dalam bingkai data. class()agak binatang yang berbeda.
Jika Anda tidak perlu mendapatkan informasi ini sebagai vektor (yaitu Anda tidak perlu melakukan hal lain secara terprogram nanti), gunakan saja str(foo).
Dalam kedua kasus fooakan diganti dengan nama bingkai data Anda.
# A tibble: 32 x 11
mpg cyl disp hp drat wt qsec vs am gear carb
*<dbl><dbl><dbl><dbl><dbl><dbl><dbl><dbl><dbl><dbl><dbl>12161601103.92.6216.5014422161601103.92.8817.00144322.84108933.852.3218.61141
Untuk bingkai data besar:
glimpse(mtcars)
memberi Anda pandangan terstruktur dari tipe data:
Observations:32
Variables:11$ mpg <dbl>21.0,21.0,22.8,21.4,18.7,18.1,14.3,24.4,22.8,19.2,17.8,16.4,17....$ cyl <dbl>6,6,4,6,8,6,8,4,4,6,6,8,8,8,8,8,8,4,4,4,4,8,8,8,8,...$ disp <dbl>160.0,160.0,108.0,258.0,360.0,225.0,360.0,146.7,140.8,167.6,167.6...$ hp <dbl>110,110,93,110,175,105,245,62,95,123,123,180,180,180,205,215...$ drat <dbl>3.90,3.90,3.85,3.08,3.15,2.76,3.21,3.69,3.92,3.92,3.92,3.07,3.0...$ wt <dbl>2.620,2.875,2.320,3.215,3.440,3.460,3.570,3.190,3.150,3.440,3.440...$ qsec <dbl>16.46,17.02,18.61,19.44,17.02,20.22,15.84,20.00,22.90,18.30,18.90...$ vs <dbl>0,0,1,1,0,1,0,1,1,1,1,0,0,0,0,0,0,1,1,1,1,0,0,0,0,...$ am <dbl>1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,...$ gear <dbl>4,4,4,3,3,3,3,4,4,4,4,3,3,3,3,3,3,4,4,4,3,3,3,3,3,...$ carb <dbl>4,4,1,1,2,1,4,2,2,4,4,3,3,3,4,4,4,1,2,1,1,2,2,4,2,...
Untuk mendapatkan daftar tipe data kolom (seperti yang dikatakan oleh @Alexandre di atas):
mengonversi kolom mpgdan amke karakter dan kolom carbke integer:
# A tibble: 32 x 11
mpg cyl disp hp drat wt qsec vs am gear carb
<chr><dbl><dbl><dbl><dbl><dbl><dbl><dbl><chr><dbl><int>12161601103.92.6216.5014422161601103.92.8817.00144322.84108933.852.3218.61141421.462581103.083.2219.41031
Berikut adalah fungsi yang merupakan bagian dari paket helpRFunctions yang akan mengembalikan daftar semua tipe data yang berbeda dalam bingkai data Anda, serta nama variabel spesifik yang terkait dengan tipe itu.
install.package('devtools')# Only needed if you dont have this installed.
library(devtools)
install_github('adam-m-mcelhinney/helpRFunctions')
library(helpRFunctions)
my.data <- data.frame(y=rnorm(5),
x1=c(1:5),
x2=c(TRUE,TRUE,FALSE,FALSE,FALSE),
X3=letters[1:5])
t <- list.df.var.types(my.data)
t$factor
t$integer
t$logical
t$numeric
Anda kemudian dapat melakukan sesuatu seperti var(my.data[t$numeric]).
sapply(..., class))
atau interaktif (misalnyastr(...)
) atau keduanya? Ini umumnya lebih terukur untuk melakukannya pemrograman, maka Anda dapat sewenang-wenangFilter(...)
daftar untuk bilangan bulat, karakter, faktor dll Atau Anda dapat menggunakangrep/grepl
untuk mengambil kesimpulan kolom-jenis darinames(...)
jika mereka mengikuti konvensi penamaan setiapstr(...)
tidak scalable dan kehabisan tenaga pada <100 cols.Jawaban:
Taruhan terbaik Anda untuk memulai adalah menggunakan
?str()
. Untuk menjelajahi beberapa contoh, mari kita buat beberapa data:Solusi @Wilmer E Henao H sangat efisien:
Menggunakan
str()
memberi Anda informasi plus barang tambahan (seperti tingkat faktor Anda dan beberapa nilai pertama dari setiap variabel):Pendekatan @Gavin Simpson juga ramping, tetapi memberikan informasi yang sedikit berbeda dari
class()
:Untuk informasi lebih lanjut tentang
class
,,typeof
dan anak tengahmode
, lihat utas SO yang luar biasa ini: Survei komprehensif tentang berbagai hal dalam R. 'mode' dan 'class' dan 'typeof' tidak cukup .sumber
str(dataframe)
adalah cara tercepat untuk menentukan jenis kolom secara sekilas. Pendekatan lain membutuhkan lebih banyak penekanan tombol dan tidak menunjukkan informasi sebanyak mungkin, tetapi mereka membantu jika tipe data kolom merupakan input ke fungsi lain.apply()
? Itu untuk matriks. Kerangka data adalah daftar (jenis khusus).Di mana bingkai data Anda adalah nama bingkai data yang Anda gunakan
sumber
saya akan menyarankan
jika Anda membutuhkan jenis aktual vektor dalam bingkai data.
class()
agak binatang yang berbeda.Jika Anda tidak perlu mendapatkan informasi ini sebagai vektor (yaitu Anda tidak perlu melakukan hal lain secara terprogram nanti), gunakan saja
str(foo)
.Dalam kedua kasus
foo
akan diganti dengan nama bingkai data Anda.sumber
Cukup berikan bingkai data Anda ke fungsi berikut:
untuk menghasilkan plot semua tipe data dalam bingkai data Anda. Untuk dataset iris, kami mendapatkan yang berikut:
sumber
Untuk bingkai data kecil:
memberi Anda hasil cetak df dengan tipe data
Untuk bingkai data besar:
memberi Anda pandangan terstruktur dari tipe data:
Untuk mendapatkan daftar tipe data kolom (seperti yang dikatakan oleh @Alexandre di atas):
memberikan daftar tipe data:
Untuk mengubah tipe data kolom:
mengonversi kolom
mpg
danam
ke karakter dan kolomcarb
ke integer:sumber
Karena tidak dinyatakan dengan jelas, saya hanya menambahkan ini:
Saya sedang mencari cara untuk membuat tabel yang menampung jumlah kemunculan semua tipe data .
Katakanlah kita memiliki
data.frame
kolom dua angka dan satu logisAnda dapat meringkas jumlah kolom dari setiap tipe data dengan itu
Ini sangat berguna, jika Anda memiliki banyak kolom dan ingin mendapatkan ikhtisar cepat.
Untuk memberikan kredit: Solusi ini terinspirasi oleh jawaban @Cybernetic .
sumber
Berikut adalah fungsi yang merupakan bagian dari paket helpRFunctions yang akan mengembalikan daftar semua tipe data yang berbeda dalam bingkai data Anda, serta nama variabel spesifik yang terkait dengan tipe itu.
Anda kemudian dapat melakukan sesuatu seperti
var(my.data[t$numeric])
.Semoga ini bisa membantu!
sumber
lapply(your_data, class)
dengan sedikit pemrosesan ekstra untuk pemformatan.Jika Anda mengimpor file csv sebagai data.frame (dan bukan matriks), Anda juga dapat menggunakan
summary.default
sumber
Pilihan lain adalah menggunakan fungsi peta dari paket purrr.
sumber