从?NA
NA是长度为1的逻辑常数,其包含丢失值指示符。 NA可以被强制转换为除原始的任何其他矢量类型。还有支持缺失值的其他原子矢量类型的常量NA_integer_,NA_real_,NA_complex_和NA_character_:所有这些都是R语言中的保留字。
您必须指定正确的类型为您的功能工作 -
您可以在函数中强制匹配的x
类型(注意,我们需要any
这对于情况超过工作1行中的一个子集!
f <- function(x) {if any((x==9)) {return(as(NA, class(x)))} else { return(x)}}
更多data.table * ISH *的做法
它可能会更有意义data.table使用set
(或:=
)以设置/替换参考。
set(dtb, i = which(dtb[,a]==9), j = 'a', value=NA_integer_)
或在[
:=
使用a==9
dtb[a == 9, a := NA_integer_]
或用二进制搜索
setkeyv(dtb, 'a')
dtb[J(9), a := NA_integer_]
有用沿着:=
矢量扫描注意
如果使用:=
点或set
的方法,你似乎没有需要指定NA
型
无论下面的工作
dtb <- data.table(a=1:10)
setkeyv(dtb,'a')
dtb[a==9,a := NA]
dtb <- data.table(a=1:10)
setkeyv(dtb,'a')
set(dtb, which(dtb[,a] == 9), 'a', NA)
这给出了一个非常有用的错误信息,让你知道的原因及解决方法:
错误[.data.table
(DTC,J(9),:=
(一,NA)): 类型RHS的( '逻辑')必须匹配LHS( '整数')。对于最快的情况,检查和强制会对性能造成太大影响。要么改变目标列的类型,要么强制:=你自己的RHS(例如,通过使用代替1)
1L哪个是最快
具有合理的大在data.set其中a
替换原位
原位
library(data.table)
set.seed(1)
n <- 1e+07
DT <- data.table(a = sample(15, n, T))
setkeyv(DT, "a")
DTa <- copy(DT)
DTb <- copy(DT)
DTc <- copy(DT)
DTd <- copy(DT)
DTe <- copy(DT)
f <- function(x) {
if (any(x == 9)) {
return(as(NA, class(x)))
} else {
return(x)
}
}
system.time({DT[a == 9, `:=`(a, NA_integer_)]})
## user system elapsed
## 0.95 0.24 1.20
system.time({DTa[a == 9, `:=`(a, NA)]})
## user system elapsed
## 0.74 0.17 1.00
system.time({DTb[J(9), `:=`(a, NA_integer_)]})
## user system elapsed
## 0.02 0.00 0.02
system.time({set(DTc, which(DTc[, a] == 9), j = "a", value = NA)})
## user system elapsed
## 0.49 0.22 0.67
system.time({set(DTc, which(DTd[, a] == 9), j = "a", value = NA_integer_)})
## user system elapsed
## 0.54 0.06 0.58
system.time({DTe[, `:=`(a, f(a)), by = a]})
## user system elapsed
## 0.53 0.12 0.66
# The are all the same!
all(identical(DT, DTa), identical(DT, DTb), identical(DT, DTc), identical(DT,
DTd), identical(DT, DTe))
## [1] TRUE
替换不出所料,二进制搜索方法是最快的
的可能重复[为什么平均行程达data.table(整数与双)?(HTTP:// stackoverflow.com/questions/12125364/why-does-median-trip-up-data-table-integer-versus-double) –
我也有一个相关的问题:[用运算符分割数据表:函数返回数值和/或NAs失败](http://stackoverflow.com/questions/7960798/splitting-a-data-table-with-the-by-operator-functions-that-return-numeric-value) –
@Alex当问题是关于错误消息时,尝试搜索SO为错误消息。例如[this search](http://stackoverflow.com/search?q=%5Bdata.table%5D+%22columns+of+j+don%27t+evaluate+to+consistent+types+for+each+group% 22&submit = search)返回上面的2个链接和第3个链接。 –