Psych 的 reverse.code 函数在 R 中生成 NA

Psych's reverse.code function producing NAs in R

在 R 中使用 reverse.code 时,一旦 ID 值超过 999(我有 10,110 个观察值),我的 ID 列中的值(不打算反转)变成 NA

有人知道我能做些什么来解决这个问题吗?

是否有其他功能可以用来在不丢失数据的情况下反转这些项目?

这是我的代码:

library(psych)
keys <- c(1,-1,-1,-1) #Where column 1 = ID and the rest are my variables to be reversed
rev_dat2 <- reverse.code(keys, rev_dat)

谢谢!

这里是reverse.code()源代码的相关行,其中new是保存反向编码数据的对象:

new[abs(new) > 999] <- NA

如您所见,将大于 9999 的值设置为缺失已硬编码到例程中。您可以编写一个没有这样做的新版本的函数。例如,在下面的函数中,我们只是设置了一个更大的阈值:

my.reverse.code <- function (keys, items, mini = NULL, maxi = NULL) 
{
  if (is.vector(items)) {
    nvar <- 1
  }
  else {
    nvar <- dim(items)[2]
  }
  items <- as.matrix(items)
  if (is.null(maxi)) {
    colMax <- apply(items, 2, max, na.rm = TRUE)
  }
  else {
    colMax <- maxi
  }
  if (is.null(mini)) {
    colMin <- apply(items, 2, min, na.rm = TRUE)
  }
  else {
    colMin <- mini
  }
  colAdj <- colMax + colMin
  if (length(keys) < nvar) {
    temp <- keys
    if (is.character(temp)) 
      temp <- match(temp, colnames(items))
    keys <- rep(1, nvar)
    keys[temp] <- -1
  }
  if (is.list(keys) | is.character(keys)) {
    keys <- make.keys(items, keys)
    keys <- diag(keys)
  }
  keys.d <- diag(keys, nvar, nvar)
  items[is.na(items)] <- -99999999999
  reversed <- items %*% keys.d
  adj <- abs(keys * colAdj)
  adj[keys > 0] <- 0
  new <- t(adj + t(reversed))
  new[abs(new) > 99999999999] <- NA
  colnames(new) <- colnames(items)
  colnames(new)[keys < 0] <- paste(colnames(new)[keys < 0], 
                                   "-", sep = "")
  return(new)
}

他们使用数值阈值的原因是,为了使他们进行重新编码,他们需要所有值都是数字。因此,他们将缺失值设置为 -999,然后再将它们恢复为缺失值。上面也是一样,但是数字大了很多。

keys <- c(1,-1,-1,-1) #Where column 1 = ID and the rest are my variables to be reversed
rev_dat <- data.frame(
  id = 9998:10002, 
  x = 1:5, 
  y = 5:1, 
  z = 1:5
)
library(psych)
reverse.code(keys, rev_dat)
#      id x- y- z-
# [1,] NA  5  1  5
# [2,] NA  4  2  4
# [3,] NA  3  3  3
# [4,] NA  2  4  2
# [5,] NA  1  5  1
my.reverse.code(keys, rev_dat)
#         id x- y- z-
# [1,]  9998  5  1  5
# [2,]  9999  4  2  4
# [3,] 10000  3  3  3
# [4,] 10001  2  4  2
# [5,] 10002  1  5  1