data.table右连接列表类型列返回NULL而非NA是漏看文档还是bug?
问题解答
关于是否为bug的说明
这一行为属于data.table的预设正常逻辑,不是bug,你也没有漏看相关文档。
底层逻辑是:data.table对不同类型列的缺失值填充规则是匹配列本身的属性的:
- 原子向量类型的列(整数、字符、数值等)缺失时填充对应类型的NA
- 列表类型的列本身是由多个独立对象组成的容器,缺失时默认填充
NULL,和原子向量的NA定位一致,属于列表场景下的默认缺失标识。
列表列缺失值替换为NA的实现方法
目前没有全局参数可以修改列表列的默认填充规则,需要在连接操作后手动处理,示例代码如下:
library(data.table) # 原始数据 dt_list <- data.table(id = c(1, 3), col1 = list(c(1, 2, 3), 2)) dt_2 <- data.table(id = c(1, 2, 3)) # 完成连接 res <- dt_list[dt_2, on = "id"] # 替换列表列中的NULL为NA res[, col1 := lapply(col1, function(x) if(is.null(x)) NA else x)]
如果需要批量处理多个列表列,可以用以下写法:
list_cols <- c("col1", "col2") # 替换为实际的列表列名 res[, (list_cols) := lapply(.SD, function(col) { lapply(col, \(x) if(is.null(x)) NA else x) }), .SDcols = list_cols]
运行后缺失位置的NULL会被替换为NA,符合需求。
关于dcast列表列填充NULL的说明
你观察到的dcast操作中列表列缺失值填充NULL的现象,和连接操作的逻辑完全一致,属于同一套默认规则,不需要单独提问。处理方法也和上述方法相同,在dcast得到结果后,遍历列表列替换NULL为NA即可。
内容的提问来源于stack exchange,提问作者gss
相关产品推荐
相关产品推荐

