Bir veri çerçevesindeki tüm sütunların sınıflarını nasıl edinebilirim?


85

Bir veri çerçevesindeki her sütunun hangi sınıfta olduğunu bulmanın kolay bir yolu nedir?

Yanıtlar:


92

Seçeneklerden biri kullanmaktır lapplyve class. Örneğin:

> foo <- data.frame(c("a", "b"), c(1, 2))
> names(foo) <- c("SomeFactor", "SomeNumeric")
> lapply(foo, class)
$SomeFactor
[1] "factor"

$SomeNumeric
[1] "numeric"

Diğer bir seçenek ise str:

> str(foo)
'data.frame':   2 obs. of  2 variables:
 $ SomeFactor : Factor w/ 2 levels "a","b": 1 2
 $ SomeNumeric: num  1 2

10
Yana classgetiri bir karakter vektör tüm bir nesne devralır gelen sınıflar, çıkışı sapply(foo, class)bir liste olabilir ve her zaman çoğu insan gibi bir karakter vektör beklenebilir. Bu biraz tehlikeli olabilir ... Ben lapplyçok daha güvenli buluyorum .
flodel

1
Daha iyi okunabilirlik için şunu öneriyorum: unlist(lapply(foo, class))çok sayıda sütunlu veri çerçeveleri için kullanışlıdır.
p130ter

1
unlistile lapplyberbat bir fikir çünkü length(class(x))>1 (yukarıdaki yorumlara bakınız) - sapplyçok daha güvenli unlist + lapply. güvenli bir yolsapply(lapply(foo, class), "[", 1)
foo'nun

28

Sen basit yapmak kullanımını can lapplyveya sapplyfonksiyonları yerleşik.

lapplysize bir list- dönecek

lapply(dataframe,class)

while sapply, ex olası en iyi dönüş türünü alacaktır. Vektör vb -

sapply(dataframe,class)

Her iki komut da size tüm sütun adlarını ilgili sınıflarıyla birlikte döndürür.


1

Merhaba aynısını arıyordu ve o da olabilirdi

unlist(lapply(mtcars,class))

0

Aile işlevlerine purrrbenzer şekilde de kullanabilirsiniz apply:

as.data.frame(purrr::map_chr(mtcars, class))
purrr::map_df(mtcars, class)

0

Yukarıdaki harika cevaplardan daha kompakt bir çıktı istedim lapply, bu yüzden burada küçük bir fonksiyon olarak sarılmış bir alternatif var.

# Example data
df <-
    data.frame(
        w = seq.int(10),
        x = LETTERS[seq.int(10)],
        y = factor(letters[seq.int(10)]),
        z = seq(
            as.POSIXct('2020-01-01'),
            as.POSIXct('2020-10-01'),
            length.out = 10
        )
    )

# Function returning compact column classes
col_classes <- function(df) {
    t(as.data.frame(lapply(df, function(x) paste(class(x), collapse = ','))))
}

# Return example data's column classes
col_classes(df)
  [,1]            
w "integer"       
x "character"     
y "factor"        
z "POSIXct,POSIXt"

Sonucunuzun 1 sütunlu bir matris olmasını istediğinizden emin misiniz? Neden? Bunun yerine bir karakter vektörüne ne dersiniz?
nbenn

Elbette, neden 1 sütunlu bir matris döndürmüyorsunuz? Bu çözümün kompakt bir çıktı için olduğunu, örneğin bir data.frame'i işledikten sonra kontrole dönmek için yararlı olduğunu belirttim. Sütun sınıflarının aşağı yönde işlenmesi için kullanılması amaçlanmamıştır. Yukarıdaki diğer cevaplar bir karakter vektörü döndürür.
Alec
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.