如何轻松查找数据框中每列的类别?
一种选择是使用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
您可以简单地利用内置函数lapply
或sapply
。
lapply
将为您返回一个list
-
lapply(dataframe,class)
而 sapply
将会取最佳的返回类型,例如向量等 -
sapply(dataframe,class)
这两个命令都将返回所有列名及其相应的类。
我希望得到比上面使用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"
你好,我在寻找相同的内容,它也可能被找到。
unlist(lapply(mtcars,class))
你也可以使用purrr
,它类似于apply
系列的函数:
as.data.frame(purrr::map_chr(mtcars, class))
purrr::map_df(mtcars, class)
class
函数返回一个对象继承的所有类的字符向量,因此sapply(foo, class)
的输出可能是一个列表,而不总是像大多数人期望的那样是一个字符向量。这可能有点危险... 我发现lapply
更安全。 - flodelunlist(lapply(foo, class))
,这在有很多列的数据框中非常方便。 - p130terlapply
和unlist
组合的方式是一个糟糕的想法,因为可能会出现length(class(x))>1
的情况(请参见上面的注释)--相比之下,sapply
比unlist + lapply
更安全。一种安全的方法是sapply(lapply(foo, class), "[", 1)
- 假设foo是一个数据框。 - lebatsnokdo.call(c, lapply(foo, class))
来获取类的向量。 - Dion Groothof