首页 > 解决方案 > 用列表替换 r data.table 中的 NULL 和 NA

问题描述

我有一个从 MongoDb 数据库作为 data.table 导入的数据集,其中一些列被格式化为列表并包含一些NULL值。当尝试通过引用第一个表来填充另一个 data.table 中的列时,这些NULL值给我带来了一些问题,因为目标列不是列表格式(因此不能有 NULL 值)。

我在下面找到了一个解决方案,目前效果很好,但是我的测试数据集只有 6 条记录,我想知道在处理更大的数据集时这是否会遇到困难,或者是否有更有效的方法来做到这一点(在 data.table )?

以下是一些示例数据:

library(data.table)
dt <- data.table(id = c(1,2,3), age = list(12, NULL, 15), sex = list("F", "M", NULL))

这是我应用的解决方案:

# Function to change NULL to NA in a data.table with lists:
null2na <- function(dtcol){
  nowna = lapply(dtcol, function(x) ifelse(is.null(x), NA_real_, x))
  return(nowna)
}

# Apply the function to the data.table to replace NULLs with NAs:
dt[, c(names(dt)) := lapply(.SD, null2na), .SDcols = names(dt)]

标签: rnulldata.tablena

解决方案


lapply您可以使用该lengths功能节省一次通话。

library(data.table)

null2na <- function(dtcol){
  dtcol[lengths(dtcol) == 0] <- NA
  return(dtcol)
}

dt[, names(dt) := lapply(.SD, null2na)]
dt
#   id age sex
#1:  1  12   F
#2:  2  NA   M
#3:  3  15  NA

agesex仍然是列表。如果您希望它们作为unlist(dtcol)函数的简单向量返回。


推荐阅读