Tentukan tipe data dari kolom bingkai data

153

Saya menggunakan R dan telah memuat data ke dalam dataframe menggunakan read.csv(). Bagaimana cara menentukan tipe data setiap kolom dalam bingkai data?

stackoverflowuser2010
sumber
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.03 1.599 -0.818 0.872 -2.682
$ x1: int  1 2 3 4 5
$ x2: logi  TRUE TRUE FALSE FALSE FALSE
$ X3: Factor w/ 5 levels "a","b","c","d",..: 1 2 3 4 5

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"

Untuk informasi lebih lanjut tentang class,, typeofdan anak tengah mode, lihat utas SO yang luar biasa ini: Survei komprehensif tentang berbagai hal dalam R. 'mode' dan 'class' dan 'typeof' tidak cukup .

gung - Pasang kembali Monica
sumber
1
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

Wilmer E. Henao
sumber
18

saya akan menyarankan

sapply(foo, typeof)

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.

Gavin Simpson
sumber
7

Cukup berikan bingkai data Anda ke fungsi berikut:

data_types <- function(frame) {
  res <- lapply(frame, class)
  res_frame <- data.frame(unlist(res))
  barplot(table(res_frame), main="Data Types", col="steelblue", ylab="Number of Features")
}

untuk menghasilkan plot semua tipe data dalam bingkai data Anda. Untuk dataset iris, kami mendapatkan yang berikut:

data_types(iris)

masukkan deskripsi gambar di sini

Berhubung dgn sibernetika
sumber
5

Untuk bingkai data kecil:

library(tidyverse)

as_tibble(mtcars)

memberi Anda hasil cetak df dengan tipe data

# 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>
 1  21       6  160    110  3.9   2.62  16.5     0     1     4     4
 2  21       6  160    110  3.9   2.88  17.0     0     1     4     4
 3  22.8     4  108     93  3.85  2.32  18.6     1     1     4     1

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):

map(mtcars, class)

memberikan daftar tipe data:

$mpg
[1] "numeric"

$cyl
[1] "numeric"

$disp
[1] "numeric"

$hp
[1] "numeric"

Untuk mengubah tipe data kolom:

library(hablar)

mtcars %>% 
  convert(chr(mpg, am),
          int(carb))

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>
 1 21        6  160    110  3.9   2.62  16.5     0 1         4     4
 2 21        6  160    110  3.9   2.88  17.0     0 1         4     4
 3 22.8      4  108     93  3.85  2.32  18.6     1 1         4     1
 4 21.4      6  258    110  3.08  3.22  19.4     1 0         3     1
davsjob
sumber
3

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.framekolom dua angka dan satu logis

dta <- data.frame(a = c(1,2,3), 
                  b = c(4,5,6), 
                  c = c(TRUE, FALSE, TRUE))

Anda dapat meringkas jumlah kolom dari setiap tipe data dengan itu

table(unlist(lapply(dta, class)))
# logical numeric 
#       1       2 

Ini sangat berguna, jika Anda memiliki banyak kolom dan ingin mendapatkan ikhtisar cepat.

Untuk memberikan kredit: Solusi ini terinspirasi oleh jawaban @Cybernetic .

loki
sumber
2

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]).

Semoga ini bisa membantu!

ML_Dev
sumber
1
Perlu dicatat bahwa di bawah tenda ini lapply(your_data, class)dengan sedikit pemrosesan ekstra untuk pemformatan.
Gregor Thomas
1

Jika Anda mengimpor file csv sebagai data.frame (dan bukan matriks), Anda juga dapat menggunakan summary.default

summary.default(mtcars)

     Length Class  Mode   
mpg  32     -none- numeric
cyl  32     -none- numeric
disp 32     -none- numeric
hp   32     -none- numeric
drat 32     -none- numeric
wt   32     -none- numeric
qsec 32     -none- numeric
vs   32     -none- numeric
am   32     -none- numeric
gear 32     -none- numeric
carb 32     -none- numeric
DJV
sumber
1

Pilihan lain adalah menggunakan fungsi peta dari paket purrr.

library(purrr)
map(df,class)
Alexandre Lima
sumber