【问题标题】:How do I get the classes of all columns in a data frame? [duplicate]如何获取数据框中所有列的类? [复制]
【发布时间】:2012-05-18 23:59:04
【问题描述】:

找出数据框中每列属于什么类的简单方法是什么?

【问题讨论】:

    标签: r


    【解决方案1】:

    一种选择是使用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
    

    【讨论】:

    • 由于class 返回一个对象继承自的所有 类的字符向量,sapply(foo, class) 的输出可能是一个列表,而不是大多数情况下的字符向量人们会期待。这可能有点危险......我发现lapply 更安全。
    • 为了更好的可读性,我建议:unlist(lapply(foo, class)) 这对于具有很多列的数据框很方便。
    • unlistlapply 是一个糟糕的主意,因为length(class(x))&gt;1(参见上面的cmets)--sapply 可能比unlist + lapply 安全得多。一个安全的方法是sapply(lapply(foo, class), "[", 1) - 因为 foo 是一个数据框
    • 也可以使用do.call(c, lapply(foo, class)) 来获取类向量。
    【解决方案2】:

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

    lapply 会给你一个list -

    lapply(dataframe,class)
    

    sapply 将采用最好的返回类型前。矢量等 -

    sapply(dataframe,class)
    

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

    【讨论】:

      【解决方案3】:

      你好在找同样的,也可能是

      unlist(lapply(mtcars,class))
      

      【讨论】:

        【解决方案4】:

        我想要一个比上面使用 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"
        

        【讨论】:

        • 您确定要让结果为 1 列矩阵吗?为什么?用字符向量代替呢?
        • 当然,为什么不返回一个 1 列的矩阵呢?我说这个解决方案适用于紧凑的输出,例如在操作 data.frame 后返回检查很有用。它不适用于列类的下游处理。上面的其他答案返回一个字符向量。
        【解决方案5】:

        你也可以使用purrr,类似于apply家族函数:

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

        【讨论】:

          猜你喜欢
          • 2019-09-15
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2020-12-26
          • 2013-03-09
          • 2019-07-19
          • 2020-07-08
          相关资源
          最近更新 更多