有序因子导致sapply(df,class)返回列表而不是vector

时间:2017-05-23 15:47:55

标签: r dataframe types

其他问题(docshere)建议使用sapply(df, class)来获取列类的向量(类似于pandas.DataFrame.dtypes)。

这是如何正常工作的一个例子:

# make some example data
n          <- 10
categories <- c('jacket','t-shirt','leg warmers')
colors     <- c('teal','neon yellow','hot pink')
sizes      <- c('XS','S','M','L','XL')
items      <- data.frame(item_id       = 1:n,
                         item_category = sample(categories, n, r=TRUE),
                         item_color    = sample(colors, n, r=TRUE),
                         item_size     = sample(sizes, n, r=TRUE))

sapply(items, class) # returns character vector of length 4
#   item_id item_category    item_color     item_size 
# "integer"      "factor"      "factor"      "factor" 

但是,如果至少有一列是有序因子,sapply(df, class)将返回一个列表。

items2 <- items
items2$item_size <- factor(items2$item_size, levels=sizes, ordered=TRUE)

sapply(items2, class) # returns list of 4
# $item_id
# [1] "integer"
# 
# $item_category
# [1] "factor"
# 
# $item_color
# [1] "factor"
# 
# $item_size
# [1] "ordered" "factor"

请注意sapply(items2, typeof)仍然会返回一个向量,虽然列类型here为什么会有所不同),它返回&#34;整数&#34;,因子类的存储模式。

我需要一个用于预处理例程的类向量,我真的只对主类感兴趣(&#34;因素&#34;不是&#34;有序&#34)。这样做的最佳方式是什么?

我自己回答的解决方案可能不是最强大的,所以我欢迎替代方案。

1 个答案:

答案 0 :(得分:2)

根据?class,函数返回&#34;一个对象继承的类向量。&#34;

假设它们按照第一个继承自第二个继承的顺序返回,等等,主类将在序列中的最后一个:

sapply(items2, function(x) tail(class(x),1) )
#   item_id item_category    item_color     item_size 
# "integer"      "factor"      "factor"      "factor"