使用%in%运算符在R中重新编码变量以避免NA

时间:2012-10-01 19:29:04

标签: r

我正在为工作中的心理测量仪器打分,并希望重新编码一些变量。基本上,每个问题都有五个可能的响应,分别为0到4。这就是他们被编码到我们的数据库中的方式,所以除了总结之外我不需要做任何事情。但是,有三个问题可以反转得分(因此,当有人回答0时,我们得分为4)。因此,我正在“扭转”那些。

数据框基本上如下所示:

studyid  timepoint      date      inst_q01  inst_q02  ...  inst_q20
   1         2       1995-03-13       0         2     ...      4
   2         2       1995-06-15       1         3     ...      4

这是我到目前为止所做的。

# Survey Processing
# Find missing values (-9) and confusions (-1), and sum them
project_f03$inst_nmiss <- rowSums(project_f03[,4:23]==-9)
project_f03$inst_nconfuse <- rowSums(project_f03[,4:23]==-1)
project_f03$inst_nmisstot <- project_f03$inst_nmiss + project_f03$inst_nconfuse

# Recode any missing values into NAs
for(x in 4:23) {project_f03[project_f03[,x]==-9 | project_f03[,x]==-1,x] <- NA}
rm(x)

现在,到目前为止,一切都很好,我即将重新编码三个相反的。现在,我最初的想法是在三个变量中做一个简单的循环,并执行一系列赋值语句,如下所示:

# Questions 3, 11, and 16 are reversed
for(x in c(3,11,16)+3) {

    project_f03[project_f03[,x]==4,x] <- 5
    project_f03[project_f03[,x]==3,x] <- 6
    project_f03[project_f03[,x]==2,x] <- 7
    project_f03[project_f03[,x]==1,x] <- 8
    project_f03[project_f03[,x]==0,x] <- 9
    project_f03[,x] <- project_f03[,x]-5
}
rm(x)

因此,五个赋值语句只是重新分配新值,循环只是通过所有三个变量。由于我正在逆转比例,我认为最简单的方法是将所有内容偏移5,然后在完成所有重新编码后减去5。然而,主要问题是存在NA并且那些NA导致循环中的错误(当然,NA==4在R中返回NA。杜 - 忘了基本规则!

我提出了三种选择,但我不确定哪种选择最好。

  • 首先,我显然可以在循环之后移动NA创建代码,它应该可以正常工作。优点:最容易实施。缺点:只有在我接收没有固有(与创建的)NA的数据时才有效。
  • 其次,我可以将逻辑语句更改为: project_f03[!is.na(project_f03[,x]) && project_f03[,x]==4,x]应该消除逻辑冲突。优点:不太难,我知道它有效。缺点:许多额外的代码,似乎是一个kludge。
  • 最后,我可以改变逻辑 project_f03[project_f03[,x]==4,x] <- 5project_f03[project_f03[,x] %in% 4,x] <- 5。这似乎工作正常,但我不确定这是一个好习惯,并想得到想法。优点:快速解决这个问题,似乎工作;保留“blah blah LOGIC blah&lt; - bleh”的一般合成流程。缺点:可能会造成黑洞?不确定使用%in%这样的潜在影响可能是什么。

编辑清除

这个问题有一个主要组成部分:在进行逻辑操作时,如上面第三点所述,使用%in%是否安全,或者有理由不这样做?

第二个组成部分是:推荐哪些方法来反转这些值,就像有些人在答案和评论中所描述的那样?

2 个答案:

答案 0 :(得分:1)

它没有回答你的问题,但应该解决你的问题:

cols <- c(3,11,16)+3
project_f03[, cols] <- abs(project_f03[, cols]-4)
## or a lot of easier (as @TylerRinker suggested):
project_f03[, cols] <- max(project_f03[, cols]) - project_f03[, cols]

答案 1 :(得分:1)

直截了当的答案是使用%in%没有黑洞。但在我想放弃NA值的情况下,我会使用whichproject_f03[which(project_f03[,x]==4),x] <- 5

%in%可以缩短您之前的代码:

for(x in 4:23) {project_f03[project_f03[,x]==-9 | project_f03[,x]==-1,x] <- NA}
#could be
for(x in 4:23) {project_f03[project_f03[,x] %in% c(-9,-1), x] <- NA}

与@flodel建议一样,您可以使用project_f03[,x] <- rev(0:4)[match(project_f03[,x], 0:4, nomatch=10)]替换for循环中的整个代码块。它应该保留NA。并且可能有更多机会来简化代码。