如何获取数据框中所有列的类别?

100

如何轻松查找数据框中每列的类别?

5个回答

107

一种选择是使用lapplyclass。例如:

> 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

11
由于class函数返回一个对象继承的所有类的字符向量,因此sapply(foo, class)的输出可能是一个列表,而不总是像大多数人期望的那样是一个字符向量。这可能有点危险... 我发现lapply更安全。 - flodel
1
为了更好的可读性,我建议使用unlist(lapply(foo, class)),这在有很多列的数据框中非常方便。 - p130ter
2
使用lapplyunlist组合的方式是一个糟糕的想法,因为可能会出现length(class(x))>1的情况(请参见上面的注释)--相比之下,sapplyunlist + lapply更安全。一种安全的方法是sapply(lapply(foo, class), "[", 1) - 假设foo是一个数据框。 - lebatsnok
一个人也可以使用 do.call(c, lapply(foo, class)) 来获取类的向量。 - Dion Groothof

33

您可以简单地利用内置函数lapplysapply

lapply将为您返回一个list -

lapply(dataframe,class)

sapply 将会取最佳的返回类型,例如向量等 -

sapply(dataframe,class)

这两个命令都将返回所有列名及其相应的类。


3

我希望得到比上面使用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
当然可以返回一个一列矩阵。我提出这个解决方案是为了紧凑的输出,比如在操作数据框后返回检查时非常有用。它不适用于处理列类的下游处理。上面的其他答案返回一个字符向量。 - Alec

3

你好,我在寻找相同的内容,它也可能被找到。

unlist(lapply(mtcars,class))

2

你也可以使用purrr,它类似于apply系列的函数:

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接