r - 用列表替换 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)]
解决方案
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
和age
列sex
仍然是列表。如果您希望它们作为unlist(dtcol)
函数的简单向量返回。
推荐阅读
- c - C 中是否可以使用 64 位字符文字?
- javascript - 使用 LimitChunkSizePlugin 从 Webpack 4 升级到 Webpack 5
- c# - 如何在Sqlite c#中使用WHERE BETWEEN从数据库中检索数据
- c# - 方法找不到在同一类 C# 中实例化的公共列表
- python - 浅拷贝不应该在python中创建一个具有不同id的对象吗?
- mysql - 根据其他表列MYSQL的计算将唯一记录插入表中
- python - 替换数据框中存在的单词
- python - 当 PermissionDenied 异常引发时 Django 打印错误
- java - 日期函数为伊斯兰日期获得额外的一天 - Kotlin
- json - 具有最大值和最小值的 JSON Schema 枚举