【发布时间】:2016-09-20 08:50:30
【问题描述】:
我有一个包含不同数据类型列的 data.table。我的目标是仅选择数字列并将这些列中的 NA 值替换为 0。 我知道用零替换 na 值是这样的:
DT[is.na(DT)] <- 0
要仅选择数字列,我找到了这个解决方案,效果很好:
DT[, as.numeric(which(sapply(DT,is.numeric))), with = FALSE]
我可以通过分配来实现我想要的
DT2 <- DT[, as.numeric(which(sapply(DT,is.numeric))), with = FALSE]
然后做:
DT2[is.na(DT2)] <- 0
但我当然希望通过引用修改我的原始 DT。但是,使用以下内容:
DT[, as.numeric(which(sapply(DT,is.numeric))), with = FALSE]
[is.na(DT[, as.numeric(which(sapply(DT,is.numeric))), with = FALSE])]<- 0
我明白了
“
[.data.table([...] i 中的错误类型(矩阵)无效”
我错过了什么? 非常感谢任何帮助!
【问题讨论】:
-
您缺少 data.tables 的基本语法,而
DT[...] <- y没有这些语法。尝试阅读小插曲github.com/Rdatatable/data.table/wiki/Getting-started 对于您认为需要采取的每个步骤,这是一种比“寻找解决方案”更有效的学习方式。下面的答案甚至不需要您找到的 with=FALSE 技巧。 -
感谢您的建议。您能否详细说明基本语法错误“...不执行 DT[...]
-
不应像
DT[...] <- y那样使用数据表,其中...是您的想法。使用:=或set完成分配,而不是使用<-。箭头方式实际上在特殊情况下确实有效,因为表格被修改了,但它不能通过引用工作(最后我检查过),所以不是惯用的。要使用 data.tables,您必须学习他们的一些习语。如果你还不知道我所说的:=是什么意思,那是查看这些小插曲的好理由。 -
a) 在顶部一次性计算列列表
numeric_cols <- which(sapply(DT,is.numeric))会更有效,而不是在每个 j 表达式中为每个组计算。 b) 然后只需引用DT[, numeric_cols]c) 是的,在 j 表达式中放置一个函数调用很棘手,并且经常会引起语法错误。
标签: r data.table numeric na