から?NA
NAは、長さ1の論理定数であり、欠落値インジケーターが含まれています。NAは、rawを除く他の任意のベクトルタイプに強制変換できます。欠測値をサポートする他のアトミックベクトルタイプの定数NA_integer_、NA_real_、NA_complex_、およびNA_character_もあります。これらはすべてR言語の予約語です。
関数を機能させるには、正しいタイプを指定する必要があります-
関数内でタイプに一致するように強制することができます(サブセットに複数の行がある状況でこれが機能するx
必要があることに注意してください!any
f <- function(x) {if any((x==9)) {return(as(NA, class(x)))} else { return(x)}}
より多くのdata.table*ish*アプローチ
参照によって設定/置換するためにset
(または)を使用する方が、data.tableの意味を理解できる場合があります。:=
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)、 (a、NA))のエラー:=
:RHSのタイプ(「論理」)はLHS(「整数」)と一致する必要があります。チェックして強制することは、最速のケースではパフォーマンスに大きな影響を与えます。ターゲット列のタイプを変更するか、:=自分自身のRHSを強制します(たとえば、1の代わりに1Lを使用して)
どちらが一番速いですか
a
その場で置き換えられる妥当な大きなdata.setを使用
その場で交換
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
当然のことながら、二分探索アプローチが最速です