Veri çerçevesi sütunlarının veri türlerini belirleme


153

R kullanıyorum ve kullanarak bir veri çerçevesine veri yükledim read.csv(). Veri çerçevesindeki her bir sütunun veri türünü nasıl belirlerim?


Programlı (örn sapply(..., class))veya etkileşimli (örn str(...)) ya da her ikisi mi? O keyfi, programlı bunu yapmak için genellikle daha ölçeklenebilir sonra Yapabileceğin Filter(...)tamsayılar, karakterler, faktörler için liste vb Yoksa kullanabilirsiniz grep/greplgelen anlaması sütun türlerine names(...)herhangi adlandırma kurallarını takip ederseniz
smci

@ smci: Orijinal sorumda 'programlı olarak' sormadım. Sorumun bütün doğasını neden değiştireceğinizi bilmiyorum.
stackoverflowuser2010

Tamam, geri alındı. Tüm doğayı değiştirmedi, iki yönden biriyle açıklığa kavuşturdu. Etkileşimli yaklaşımlar str(...)ölçeklendirilemez ve 100'den az kömürde buhar biter.
smci

Yanıtlar:


215

Başlamak için en iyi bahis kullanmaktır ?str(). Bazı örnekleri incelemek için bazı veriler yapalım:

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

@Wilmer E Henao H'nin çözümü oldukça akıcı:

sapply(my.data, class)
        y        x1        x2        X3 
"numeric" "integer" "logical"  "factor" 

str()Bunu kullanmak size bilgi artı ekstra hediyeler (faktörlerinizin seviyeleri ve her değişkenin ilk birkaç değeri gibi) sağlar:

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

@Gavin Simpson yaklaşımı da basitleştirildi, ancak biraz daha farklı bilgiler sunuyor class() :

sapply(my.data, typeof)
       y        x1        x2        X3 
"double" "integer" "logical" "integer"

, Ve orta çocuk hakkında daha fazla bilgi için class, bu mükemmel SO iş parçacığına bakın: R. 'modu' ve 'sınıf' ve 'tipeof' türlerindeki şeylerin kapsamlı bir araştırması yetersizdir . typeofmode


1
Birkaç ay boyunca R kullandıktan sonra str(dataframe), bir bakışta sütun türlerini belirlemenin en hızlı yolunun olduğunu buldum . Diğer yaklaşımlar daha fazla tuş vuruşu gerektirir ve çok fazla bilgi göstermez, ancak sütun veri türleri diğer işlevlere bir girdi ise yararlıdır.
stackoverflowuser2010

Merhaba ben uygulamak yerine uygulamak ile aynı yaptığımda, işe yaramadı
Dom Jo

@DomJo, neden kullanıyorsun apply()? Bu matrisler için. Veri çerçevesi (özel tür) bir listedir.
gung - Monica

50
sapply(yourdataframe, class)

Veri çerçeveniz, kullandığınız veri çerçevesinin adıdır


18

öneririm

sapply(foo, typeof)

veri çerçevesindeki gerçek vektör türlerine ihtiyacınız varsa. class()biraz farklı bir canavardır.

Bu bilgiyi bir vektör olarak almanız gerekmiyorsa (yani daha sonra programlı olarak başka bir şey yapmanız gerekmez) kullanın str(foo).

Her iki durumda fooda veri çerçevenizin adı ile değiştirilir.


7

Veri çerçevenizi aşağıdaki işleve geçirmeniz yeterlidir:

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")
}

veri çerçevenizdeki tüm veri türlerinin bir grafiğini oluşturmak için. İçin iris verisetine Weka'daki biz izleyici kitlesi elde:

data_types(iris)

resim açıklamasını buraya girin


5

Küçük veri çerçeveleri için:

library(tidyverse)

as_tibble(mtcars)

veri türleriyle df'den çıktı almanızı sağlar

# 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

Büyük veri çerçeveleri için:

glimpse(mtcars)

veri türlerinin yapılandırılmış bir görünümünü sunar:

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, ...

Sütunların veri türlerinin bir listesini almak için (yukarıdaki @Alexandre tarafından söylendiği gibi):

map(mtcars, class)

veri türlerinin bir listesini verir:

$mpg
[1] "numeric"

$cyl
[1] "numeric"

$disp
[1] "numeric"

$hp
[1] "numeric"

Bir sütunun veri türünü değiştirmek için:

library(hablar)

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

sütunları mpgve amkarakteri ve sütunu carbtamsayıya dönüştürür:

# 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

3

Açıkça belirtilmediğinden, sadece şunu ekliyorum:

Tüm veri türlerinin oluşum sayısını tutan bir tablo oluşturmak için bir yol arıyordum .

Diyelim ki data.frameiki sayısal ve bir mantıksal sütun var

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

Her veri türünün sütun sayısını bununla özetleyebilirsiniz.

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

Çok fazla sütununuz varsa ve hızlı bir genel bakış almak istiyorsanız, bu son derece kullanışlıdır.

Kredi vermek için: Bu çözüm, @Cybernetic'in cevabından ilham aldı .


2

Burada helpRFunctions paketinin bir parçası olan ve veri çerçevenizdeki çeşitli veri türlerinin bir listesini ve bu türle ilişkili belirli değişken adlarını döndüren bir işlev vardır .

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

Sonra böyle bir şey yapabilirsiniz var(my.data[t$numeric]).

Umarım bu yardımcı olur!


1
Kaputun altında bu, lapply(your_data, class)biçimlendirme için biraz ekstra işleme ile dikkat çekiyor .
Gregor Thomas

1

Csv dosyasını data.frame olarak içe aktarırsanız (matris değil), 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

1

Başka bir seçenek de purrr paketinin harita fonksiyonunu kullanmaktır.

library(purrr)
map(df,class)
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.