【问题标题】:Ordered factors cause sapply(df, class) to return list instead of vector有序因素导致 sapply(df, class) 返回列表而不是向量
【发布时间】:2017-05-23 15:47:54
【问题描述】:

其他问题(herehere)建议使用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) 仍然返回一个向量,尽管列 typesdiscussion 为何不同)返回“integer”,即因子类的存储模式。

我需要一个用于预处理例程的类向量,而我真的只对 主类 感兴趣(“因子”而不是“有序”)。最好的方法是什么?

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

【问题讨论】:

    标签: r dataframe types


    【解决方案1】:

    根据?class,该函数返回“对象继承的类的向量”。

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

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

    【讨论】:

    • 您可以将rev(class(x))[1] 替换为tail(class(x), 1)
    • @C8H10N4O2 实际上,在较大的向量上,您的向量会更有效。选择最后一个元素比先反转整个向量然后选择第一个元素更容易。最快的是:{cl &lt;- class(x) ; cl[length(cl)]}.
    • @JorisMeys 同意,但我最初的答案是 rev()
    • @C8H10N4O2 哎呀,我的错 :-)
    猜你喜欢
    • 2022-10-14
    • 2022-01-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多