Как мне получить классы всех столбцов во фрейме данных?


85

Каков простой способ узнать, к какому классу принадлежит каждый столбец во фрейме данных?

Ответы:


92

Один из вариантов - использовать lapplyи class. Например:

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

$SomeNumeric
[1] "numeric"

Другой вариант str:

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

10
Поскольку classвозвращает вектор символов всех классов, от которых наследуется объект, выводом sapply(foo, class)может быть список, а не всегда вектор символов, как ожидает большинство людей. Что может быть немного опасно ... Я считаю, lapplyчто намного безопаснее.
flodel

1
для лучшей читаемости я предлагаю: unlist(lapply(foo, class))что удобно для фреймов данных с большим количеством столбцов.
p130ter

1
unlistwith lapply- ужасная идея, потому что возможно length(class(x))>1 (см. комментарии выше) - sapplyнамного безопаснее, чем unlist + lapply. безопасный способ sapply(lapply(foo, class), "[", 1)- учитывая, что foo - это фрейм данных
lebatsnok

28

Вы можете просто использовать lapplyили sapplyвстроенные функции.

lapplyвернет вам list-

lapply(dataframe,class)

while sapplyбудет принимать наилучший из возможных возвращаемых типов ex. Вектор и т. Д. -

sapply(dataframe,class)

Обе команды вернут вам все имена столбцов с их соответствующим классом.



0

Вы также можете использовать purrr, что похоже на applyсемейные функции:

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

0

Я хотел получить более компактный результат, чем использованные выше отличные ответы lapply, поэтому вот альтернатива, оформленная как небольшая функция.

# 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"

Вы уверены, что хотите, чтобы результат был матрицей с одним столбцом? Почему? Как насчет вектора символов?
nbenn

Конечно, почему бы не вернуть матрицу с одним столбцом? Я заявил, что это решение предназначено для компактного вывода, полезно, например, для возврата к проверке после манипулирования data.frame. Он не предназначен для последующей обработки классов столбцов. Другие ответы выше возвращают вектор символов.
Alec
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.