考虑一下
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
答案 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()