【问题标题】:Convert any number of vectors into a dataframe whilst preserving data types and using vector names as column names in R将任意数量的向量转换为数据帧,同时保留数据类型并将向量名称用作 R 中的列名称
【发布时间】:2019-06-20 21:36:11
【问题描述】:

是否有一个简单的函数(最好是用户编写的,或者在 base R 中找到),它接受任意数量的向量,并生成一个数据框,同时保留向量的数据类型,并使用向量变量的名称作为列名?

一个例子

输入(向量)

> var_a # character
[1] "a" "b" "c"

> var_b # numeric
[1] 1 3 4

> var_c # factor
[1] red   black black
Levels: black red

期望的输出

  var_a var_b var_c
1     a     1   red
2     b     3 black
3     c     4 black

类在哪里

sapply(my_dataframe, class)

#      var_a       var_b       var_c 
#"character"   "numeric"    "factor"

尝试 1 - 使用 cbind

使用cbind 将生成一个矩阵(具有单一数据类型) - 因此此方法不会维护向量的原始数据类型(它将所有列更改为字符)

first_method <- cbind(var_a, var_b, var_c)

尝试 2 - 使用do.call(类似于here

在这种情况下,数据类型会丢失,向量变量的名称也会丢失

ls <- list(var_a, var_b, var_c)
second_method <- data.frame(do.call(cbind, ls))
second_method %>% sapply(class)
#       X1       X2       X3 
# "factor" "factor" "factor"

尝试 3 - 使用 data.frame

这个方法很接近(它将向量名称保留为数据框中的列名),但不幸的是它将字符数据类型转换为因子

third_method <- data.frame(var_a, var_b, var_c)
third_method %>% sapply(class)
#    var_a     var_b     var_c 
# "factor" "numeric"  "factor" 

尝试 4 - 手动声明数据框的每一列及其名称和数据类型

这会返回所需的输出,但是它并不雄辩,而是对大量向量进行很多的手动编码,并且容易出现用户错误,因为用户必须为每一列手动指定数据类型

fourth_method <- data.frame("var_a"=as.character(var_a), "var_b"=as.numeric(var_b), "var_c"=as.factor(var_c), stringsAsFactors = FALSE)
fourth_method %>% sapply(class)

#      var_a       var_b       var_c 
#"character"   "numeric"    "factor" 

注意:thisthisthis 解决方案不适用,因为它们会导致数据类型丢失

另请注意:此问题中的向量不是this问题中提到的命名向量

此时,我的想法不多,不确定下一步该尝试什么?

【问题讨论】:

    标签: r


    【解决方案1】:

    这适用于data.frame。您只需添加参数stringsAsFactors=FALSE

    df = data.frame(var_a, var_b, var_c, stringsAsFactors = FALSE)
    sapply(df, class)
          var_a       var_b       var_c 
    "character"   "numeric"    "factor" 
    

    【讨论】:

      【解决方案2】:

      我们可以使用tibble 来保留列类型

      library(tibble)
      tibble(var_a, var_b, var_c)
      # A tibble: 3 x 3
      #  var_a var_b var_c
      #  <chr> <dbl> <fct>
      #1 a         1 red  
      #2 b         3 black
      #3 c         4 black
      

      注意:tibble 可以与 tidyverse 操作一起使用,但如果我们真的需要 data.frame,将其转换为 data.frame 仍将保留数据类型

      tibble(var_a, var_b, var_c) %>%
          as.data.frame %>%
          str
      #'data.frame':  3 obs. of  3 variables:
      # $ var_a: chr  "a" "b" "c"
      # $ var_b: num  1 3 4
      # $ var_c: Factor w/ 2 levels "black","red": 2 1 1
      

      【讨论】:

        猜你喜欢
        • 2018-03-25
        • 2023-03-31
        • 2020-08-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-05-09
        • 2016-02-02
        • 1970-01-01
        相关资源
        最近更新 更多