我是R的新手,并使用do.call("rbind", df.list)
来组合数据框列表。
数据框将数组作为列,rbind确实删除数组,但前提是列表中至少有两个元素要合并。
快速举例:
> class(rbind(data.frame(a=array(1,2)), data.frame(a=array(3,4)))$a)
[1] "numeric"
> class(rbind(data.frame(a=array(1,2)))$a)
[1] "array"
这是rbind中的错误吗?看来如果用一个参数调用它,它只返回该参数,而如果用多个调用,它确实删除了数组。
如果长度(df.list)== 1,我如何“取消”这样的数据框?
我需要的例子:
> df.list1 <- list(data.frame(a=array(1,2), b=array("a")), data.frame(a=array(3,4), b=array("b")))
> df.list2 <- list(data.frame(a=array(1,2), b=array("a")))
> df.combined1 <- do.call("rbind", df.list1)
> df.combined2 <- do.call("rbind", df.list2)
> class(df.combined1$a)
[1] "numeric"
> class(df.combined2$a)
[1] "array"
目标是让数据框df.combined不具有独立的数组列,无论df.list是否具有一个或多个元素。数据框列的类型和编号事先是未知的。
答案 0 :(得分:0)
让我们从:
开始class(rbind(data.frame(a=array(1,2)), data.frame(a=array(3,4))))
class(rbind(data.frame(a=array(1,2))))
这两个都有data.frame
类。
现在,你注意到了:
> class(rbind(data.frame(a=array(1,2)), data.frame(a=array(3,4)))$a)
[1] "numeric"
> class(rbind(data.frame(a=array(1,2)))$a)
[1] "array"
第一个是预期的,但是,由于rbind
的{{1}}方法,第二个是意料之外的。根据{{1}}的文档:
...它[然后]从第一个数据框中获取列的类,...
如果您想在单data.frame
到rbind
的情况下强制使用该类,那么您可以使用以下内容:
array
强制它numeric
摆脱ifelse(length(df.list) == 1,
class(rbind(data.frame(a=as.vector(array(1,2))))$a),
...)
类。
(编辑:根据您的需要,您可能也会受益于以下评论中的讨论!)
最后,请注意,这仅适用于一维as.vector
。对于更高的维度,您可以获得适当的类:
array
编辑:根据您的更新,我认为这就是您想要的:
array
希望这有帮助!