Jak uzyskać klasy wszystkich kolumn w ramce danych?

85

Jaki jest łatwy sposób, aby dowiedzieć się, jaką klasą jest każda kolumna w ramce danych?

Kyle Brandt
źródło

Odpowiedzi:

91

Jedną z opcji jest użycie lapplyi class. Na przykład:

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

$SomeNumeric
[1] "numeric"

Inną opcją jest str:

> str(foo)
'data.frame':   2 obs. of  2 variables:
 $ SomeFactor : Factor w/ 2 levels "a","b": 1 2
 $ SomeNumeric: num  1 2
Kyle Brandt
źródło
20
Równieżsapply(foo, class)
MYaseen208
9
Ponieważ classzwraca wektor znakowy wszystkich klas, z których dziedziczy obiekt, wynikiem sapply(foo, class)może być lista, a nie zawsze wektor znakowy, jak by się spodziewała większość ludzi. Co może być trochę niebezpieczne ... Uważam, że lapplyjest o wiele bezpieczniejsze.
flodela
1
dla lepszej czytelności proponuję: unlist(lapply(foo, class))co jest przydatne w przypadku ramek danych z dużą liczbą kolumn.
p130,
1
unlistz lapplyto okropny pomysł, ponieważ jest możliwe, że length(class(x))>1 (patrz komentarze powyżej) - sapplyjest o wiele bezpieczniejszy niż unlist + lapply. bezpiecznym sposobem byłoby sapply(lapply(foo, class), "[", 1)- biorąc pod uwagę, że foo jest ramką danych
lebatsnok
27

Możesz w prosty sposób korzystać z funkcji lapplylub sapplywbudowanych.

lapplyzwróci ci list-

lapply(dataframe,class)

while sapplyzajmie najlepszy możliwy typ zwrotu, np. Wektor itp -

sapply(dataframe,class)

Oba polecenia zwrócą wszystkie nazwy kolumn wraz z odpowiednią klasą.

Rohit Saini
źródło
1

Witam szukałem tego samego, a mogłoby też być

unlist(lapply(mtcars,class))
Seyma Kalay
źródło
0

Możesz również użyć purrr, co jest podobne do applyfunkcji rodzinnych:

as.data.frame(purrr::map_chr(mtcars, class))
purrr::map_df(mtcars, class)
AlexB
źródło