首页 > 解决方案 > 将任意数量的向量转换为数据帧,同时保留数据类型并将向量名称用作 R 中的列名

问题描述

是否有一个简单的函数(最好是用户编写的,或者在基础 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(类似于此处

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

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解决方案不合适,因为它们会导致数据类型丢失

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

在这一点上,我的想法不足,不确定下一步该尝试什么?

标签: r

解决方案


这适用于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" 

推荐阅读