rbind为单个参数和多个参数做不同的事情

时间:2014-04-25 00:01:25

标签: r

我是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是否具有一个或多个元素。数据框列的类型和编号事先是未知的。

1 个答案:

答案 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.framerbind的情况下强制使用该类,那么您可以使用以下内容:

array

强制它numeric摆脱ifelse(length(df.list) == 1, class(rbind(data.frame(a=as.vector(array(1,2))))$a), ...) 类。 (编辑:根据您的需要,您可能也会受益于以下评论中的讨论!)

最后,请注意,这仅适用于一维as.vector。对于更高的维度,您可以获得适当的类:

array

编辑:根据您的更新,我认为这就是您想要的:

array

希望这有帮助!