r - data.table 就地替换不起作用
问题描述
我正在尝试使用以下代码替换非数字和逻辑列中的 NA:
test_dt <- data.table(a = c("foo", "bar", "foo_bar"),
b = c(1.243, NA, 78454),
c = c(NA, NA, NA),
d = c(1.242345235, 2.3453255635, 475.253552352),
e = as.POSIXlt(c(NA, rep(Sys.time(), 2)), origin = as.POSIXlt(Sys.time(), "GMT"), tz = "GMT"),
f = c(T, F, NA),
g = as.Date(c(Sys.Date(), Sys.Date() - 5, NA)))
replaceNABlank <- function(DT, cols) {
for (j in cols)
set(DT,which(is.na(DT[[j]])) ,j, '')
print(DT)
}
to_quote <- names(test_dt)[!(sapply(test_dt, class) %in% c('logical', 'numeric', 'integer'))]
options(useFancyQuotes = FALSE)
test_dt <- test_dt[, (to_quote) := lapply(.SD, as.character), .SDcols = to_quote]
test_dt1 <- replaceNABlank(test_dt, to_quote)
示例数据在代码中提供。
在输出print(DT)
中打印正确但是test_dt1
是NULL
. 在我的情况下,我尝试采用最快的方法来替换大型 data.table 中的 NA,但它似乎不起作用。有什么解释吗?
解决方案
我相信问题在于您的函数返回值。您使用print(DT)
,但如果您想分配实际结果,您应该简单地返回DT
。因此,一种方法是将函数更改为:
replaceNABlank <- function(DT, cols) {
for (j in cols)
set(DT,which(is.na(DT[[j]])) ,j, '')
DT
}
但是,由于通过引用data.table::set
更新列,您还可以考虑执行以下操作:
test_dt[, (to_quote) := lapply(.SD, as.character), .SDcols = to_quote]
replaceNABlank(test_dt, to_quote)
test_dt
# a b c d e f g
#1: foo 1.243 NA 1.242345 TRUE 2018-05-09
#2: bar NA NA 2.345326 2066-09-15 06:43:38 FALSE 2018-05-04
#3: foo_bar 78454.000 NA 475.253552 2066-09-15 06:43:38 NA
推荐阅读
- python - python中迄今为止的数字字符串
- c - 我正在使用 GNU GCC 编译器,但 code::blocks 要求使用 Cygwin GCC 编译器
- r - 基于元数据转换数据,避免使用 data.table 连接的 for 循环
- sql - SQLSTATE [23000]:违反完整性约束:1062 重复条目 - 可配置产品
- glsl - android vulkan顶点着色器无法获取所有输入数据
- google-sheets - =谷歌表格中的图像公式不起作用
- javascript - 是否可以在 CKEditor 中获得插入符号位置?角度 - javascript
- python - Python - 从 cli 运行 pip 安装包
- python - Python使用QGridLayout不添加小部件
- apache-kafka - Kafka - 紧凑和基于时间的保留