あなたが探しているものはわかっていますが、それは R には実装されていません。それが実装されているパッケージについての知識はありませんが、自分でコーディングするのはそれほど難しくありません。
実行可能な方法は、コードを含む属性にデータフレームを追加することです。データフレーム全体が 2 倍にならないようにしてスペースを節約するには、完全なデータフレームを再構築するのではなく、そのデータフレームにインデックスを追加します。
例:
NACode <- function(x,code){
Df <- sapply(x,function(i){
i[i %in% code] <- NA
i
})
id <- which(is.na(Df))
rowid <- id %% nrow(x)
colid <- id %/% nrow(x) + 1
NAdf <- data.frame(
id,rowid,colid,
value = as.matrix(x)[id]
)
Df <- as.data.frame(Df)
attr(Df,"NAcode") <- NAdf
Df
}
これにより、次のことが可能になります。
> Df <- data.frame(A = 1:10,B=c(1:5,-1,-2,-3,9,10) )
> code <- list("Missing"=-1,"Not Answered"=-2,"Don't know"=-3)
> DfwithNA <- NACode(Df,code)
> str(DfwithNA)
'data.frame': 10 obs. of 2 variables:
$ A: num 1 2 3 4 5 6 7 8 9 10
$ B: num 1 2 3 4 5 NA NA NA 9 10
- attr(*, "NAcode")='data.frame': 3 obs. of 4 variables:
..$ id : int 16 17 18
..$ rowid: int 6 7 8
..$ colid: num 2 2 2
..$ value: num -1 -2 -3
関数を調整して、さまざまな値のラベルを提供する追加の属性を追加することもできます。この質問も参照してください。次の方法で逆変換できます。
ChangeNAToCode <- function(x,code){
NAval <- attr(x,"NAcode")
for(i in which(NAval$value %in% code))
x[NAval$rowid[i],NAval$colid[i]] <- NAval$value[i]
x
}
> Dfback <- ChangeNAToCode(DfwithNA,c(-2,-3))
> str(Dfback)
'data.frame': 10 obs. of 2 variables:
$ A: num 1 2 3 4 5 6 7 8 9 10
$ B: num 1 2 3 4 5 NA -2 -3 9 10
- attr(*, "NAcode")='data.frame': 3 obs. of 4 variables:
..$ id : int 16 17 18
..$ rowid: int 6 7 8
..$ colid: num 2 2 2
..$ value: num -1 -2 -3
これにより、必要に応じて必要なコードのみを変更できます。この関数は、引数が指定されていない場合にすべてのコードを返すように適合させることができます。コードに基づいてデータを抽出する同様の関数を構築できます。
しかし、1行で:属性とインデックスを使用することは、それを行うための良い方法かもしれません.