Элегантный способ получить классы data.frame - PullRequest
4 голосов
/ 15 ноября 2011

В настоящее время я использую следующую функцию для вывода списка классов data.frame:

sapply(names(iris),function(x) class(iris[,x]))

Должен быть более элегантный способ сделать это ...

Ответы [ 2 ]

9 голосов
/ 15 ноября 2011

Поскольку data.frames уже являются списками, sapply(iris, class) будет просто работать. sapply не сможет упростить вектор для классов, расширяющих другие классы, поэтому вы можете сделать что-нибудь, чтобы взять первый класс, вставить классы вместе и т. Д.

3 голосов
/ 15 ноября 2011

РЕДАКТИРОВАТЬ Если вы просто хотите СМОТРЕТЬ на занятиях, рассмотрите возможность использования str:

str(iris) # Show "summary" of data.frame or any other object
#'data.frame':   150 obs. of  5 variables:
# $ Sepal.Length: num  5.1 4.9 4.7 4.6 5 5.4 4.6 5 4.4 4.9 ...
# $ Sepal.Width : num  3.5 3 3.2 3.1 3.6 3.9 3.4 3.4 2.9 3.1 ...
# $ Petal.Length: num  1.4 1.4 1.3 1.5 1.4 1.7 1.4 1.5 1.4 1.5 ...
# $ Petal.Width : num  0.2 0.2 0.2 0.2 0.2 0.4 0.3 0.2 0.2 0.1 ...
# $ Species     : Factor w/ 3 levels "setosa","versicolor",..: 1 1 1 1 1 1 1 1 1 1 ...

Но если остановиться на превосходном ответе @JoshuaUlrish, то data.frame со столбцами времени или упорядоченного фактора вызовет боль при решении sapply:

d <- data.frame(ID=1, time=Sys.time(), factor=ordered(42))

# This doesn't return a character vector anymore
sapply(d, class)
#$ID
#[1] "numeric"
#
#$time
#[1] "POSIXct" "POSIXt" 
#
#$factor
#[1] "ordered" "factor" 

# Alternative 1: Get the first class
sapply(d, function(x) class(x)[[1]])
#       ID      time    factor 
#"numeric" "POSIXct" "ordered"

# Alternative 2: Paste classes together
sapply(d, function(x) paste(class(x), collapse='/'))
#          ID             time           factor 
#   "numeric" "POSIXct/POSIXt" "ordered/factor"     

Обратите внимание, что ни одно из этих решений не является идеальным. Получение только первого (или последнего) класса может вернуть что-то совершенно бессмысленное. Приклеивание затрудняет использование составного класса. Иногда вы можете просто захотеть определить, когда это происходит, поэтому ошибка будет предпочтительнее (и я люблю vapply ;-):

# Alternative 3: Fail if there are multiple-class columns
vapply(d, class, character(1))
#Error in vapply(d, class, character(1)) : values must be length 1,
# but FUN(X[[2]]) result is length 2
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...