Я знаю, что вы ищете, и это не реализовано в R. У меня нет сведений о пакете, в котором он реализован, но не так уж сложно написать его самостоятельно.
Реальным способом является добавление кадра данных к атрибутам, содержащим коды. Чтобы не удваивать весь фрейм данных и не экономить место, я бы добавил индексы в этот фрейм вместо того, чтобы восстанавливать полный фрейм данных.
Например:
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
Это позволяет изменять только те коды, которые вы хотите, если это когда-либо необходимо. Функция может быть адаптирована для возврата всех кодов, когда аргумент не указан. Подобные функции могут быть созданы для извлечения данных, основанных на коде, я думаю, что вы можете понять это самостоятельно.
Но в одной строке: использование атрибутов и индексов может быть хорошим способом сделать это.