【发布时间】:2012-05-18 23:59:04
【问题描述】:
找出数据框中每列属于什么类的简单方法是什么?
【问题讨论】:
标签: r
找出数据框中每列属于什么类的简单方法是什么?
【问题讨论】:
标签: r
一种选择是使用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
【讨论】:
class 返回一个对象继承自的所有 类的字符向量,sapply(foo, class) 的输出可能是一个列表,而不是大多数情况下的字符向量人们会期待。这可能有点危险......我发现lapply 更安全。
unlist(lapply(foo, class)) 这对于具有很多列的数据框很方便。
unlist 和lapply 是一个糟糕的主意,因为length(class(x))>1(参见上面的cmets)--sapply 可能比unlist + lapply 安全得多。一个安全的方法是sapply(lapply(foo, class), "[", 1) - 因为 foo 是一个数据框
do.call(c, lapply(foo, class)) 来获取类向量。
您可以简单地使用lapply 或sapply 内置函数。
lapply 会给你一个list -
lapply(dataframe,class)
而sapply 将采用最好的返回类型前。矢量等 -
sapply(dataframe,class)
这两个命令都将返回所有列名及其各自的类。
【讨论】:
你好在找同样的,也可能是
unlist(lapply(mtcars,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"
【讨论】:
你也可以使用purrr,类似于apply家族函数:
as.data.frame(purrr::map_chr(mtcars, class))
purrr::map_df(mtcars, class)
【讨论】: