gpt4 book ai didi

r - data.table 的 do.call rbind 取决于 NA 的位置

转载 作者:行者123 更新时间:2023-12-04 11:39:12 24 4
gpt4 key购买 nike

考虑这个

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 次,数据表比数据帧快很多倍,所以我希望它能够工作......)
问候
萨塔什

最佳答案

正如弗兰克所指出的,问题在于(有些不可见)有几种不同类型的 NA .当你输入 NA 时产生的那个在命令行是类 "logical" ,但也有NA_integer_ , NA_real_ , NA_character_ , 和 NA_complex_ .

在您的第一个示例中,初始 data.table设置列的类别 b到“字符”,而 NA在第二个 data.table然后被强制为 NA_character_ .但是,在第二个示例中,NA在第一个 data.table集列b的类为“逻辑”,并且,当第二个 data.table 中的同一列被强制为“逻辑”时,它被转换为逻辑 NA。 (试试 as.logical("x") 看看为什么。)

这一切都相当复杂(至少要表达清楚),但有一个相当简单的解决方案。只需创建一个 1 行模板 data.table , 并将其添加到 data.table 的每个列表中你想rbind() .无论 data.table 是什么,它都会将每列的类建立为您想要的在传递给 rbind() 的列表中关注它, 并且可以在其他所有内容绑定(bind)在一起后修剪掉。

library(data.table)    

## The two lists of data.tables from the OP
A <- list(data.table(x=1, b='x'),data.table(x=1, b=NA))
B <- list(data.table(x=1, b=NA),data.table(x=1, b='x'))

## A 1-row template, used to set the column types (and then removed)
DT <- data.table(x=numeric(1), b=character(1))

## Test it out
do.call(rbind, c(list(DT), A))[-1,]
# x b
# 1: 1 x
# 2: 1 NA
do.call(rbind, c(list(DT), B))[-1,]
# x b
# 1: 1 NA
# 2: 1 x

## Finally, as _also_ noted by Frank, rbindlist will likely be more efficient
rbindlist(c(list(DT), B)[-1,]

关于r - data.table 的 do.call rbind 取决于 NA 的位置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18475161/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com