【发布时间】: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"
注意:this、this 和 this 解决方案不适用,因为它们会导致数据类型丢失
另请注意:此问题中的向量不是this问题中提到的命名向量
此时,我的想法不多,不确定下一步该尝试什么?
【问题讨论】:
标签: r