data.cable的do.call rbind取决于NA的位置

时间:2013-08-27 20:45:39

标签: r data.table rbind do.call

考虑一下

do.call(rbind, list(data.table(x=1, b='x'),data.table(x=1, b=NA)))

返回

   x  b
1: 1  x
2: 1 NA

do.call(rbind, list(data.table(x=1, b=NA),data.table(x=1, b='x')))

返回

   x  b
1: 1 NA
2: 1 NA

如何在不重新排序列表内容的情况下强制执行第一个行为?

数据表在mapreduce作业中确实更快(在55个节点上调用data.table~10 * 3MM次,数据表比数据帧快很多倍,所以我希望这个工作......) 问候 saptarshi

1 个答案:

答案 0 :(得分:8)

正如弗兰克所指出的那样,问题在于(有些看不见)有几种不同类型的NA。在命令行中键入NA时生成的类型为"logical"类,但还有NA_integer_NA_real_NA_character_和{{1} }}。

在您的第一个示例中,初始NA_complex_将列data.table的类设置为“字符”,然后第二个b中的NA被强制转换为data.table。但是,在第二个示例中,第一个NA_character_中的NA将列data.table的类设置为“逻辑”,并且当第二个data.table中的同一列被强制时为了“逻辑”,它被转换为逻辑NA。 (尝试b了解原因。)

这一切都相当复杂(至少要表达清楚),但有一个相当简单的解决方案。只需创建一个单行模板as.logical("x"),并将其添加到您希望data.table的每个data.table列表中。它会将每列的类建立为您想要的类,无论rbind()在传递给data.table的列表中遵循它是什么,并且可以在其他所有内容绑定在一起时进行修剪。< / p>

rbind()