【问题标题】:In a large data set, identify which variables are categorical and which are numeric在大型数据集中,确定哪些变量是分类变量,哪些是数值变量
【发布时间】:2014-07-17 10:13:35
【问题描述】:

我有一个包含 65 个变量的列表,我想将数字变量和分类变量列表分开。

这个任务的命令是什么。

【问题讨论】:

    标签: r


    【解决方案1】:

    您可以这样做(假设您的 data.frame 名为 df):

    sapply(df, class)
    

    确实,带有时间变量的输出不太漂亮:

    library(lubridate)
    df <- data.frame(V1 = character(10),
                     V2 = numeric(10),
                     V3 = ymd(paste("2014-05", 21:30, sep="-")))
    sapply(df, class)
    ##$V1
    ##[1] "factor"
    ##
    ##$V2
    ##[1] "numeric"
    ##
    ##$V3
    ##[1] "POSIXct" "POSIXt" 
    

    但它仍然可以识别数字或因子变量,例如没有时间变量:

    names(df)[sapply(df, class) == "factor"]
    ##[1] "V1"
    
    # for time variable it's less obvious indeed...
    names(df)[grepl("POSIXct", sapply(df, class))]
    ##[1] "V3"
    

    【讨论】:

    • 永远不要在类中使用sapply():只要数据框中有时间变量,这就会失败。
    • 感谢 cmets,我已经遇到了这个问题...您建议使用什么? mode?
    【解决方案2】:

    您可以使用split 和sapply 将变量组合在一起:

    split(names(iris),sapply(iris, function(x) paste(class(x), collapse=" ")))
    $factor
    [1] "Species"
    
    $numeric
    [1] "Sepal.Length" "Sepal.Width"  "Petal.Length" "Petal.Width"
    

    注意使用paste 将任何多类对象的类名折叠在一起。

    【讨论】:

    • 感谢 James,它给出了我想要的结果。
    • 永远不要在类中使用sapply():只要数据框中有时间变量,这就会失败。
    • 感谢@hadley,我进行了编辑,以使解决方案对多类变量问题更加稳健。
    • @Rahul 用于只有一个类的变量。我添加的额外内容有助于防止多类变量。
    猜你喜欢
    • 1970-01-01
    • 2015-05-05
    • 1970-01-01
    • 2017-09-13
    • 1970-01-01
    • 2011-09-22
    • 2017-12-26
    • 1970-01-01
    • 2014-06-05
    相关资源
    最近更新 更多