我正在为工作中的心理测量仪器评分,并想重新编码一些变量。基本上,每个问题都有五个可能的答案,分别为 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 会导致循环中的错误(自然会在 R 中NA==4
返回一个NA
)。呃 - 忘记了一个基本规则!
我想出了三个替代方案,但我不确定哪个是最好的。
- 首先,我显然可以在循环之后移动创建 NA 的代码,它应该可以正常工作。优点:最容易实现。缺点:仅当我接收没有先天(相对于创建)NA 的数据时才有效。
- 其次,我可以将逻辑语句更改为:
project_f03[!is.na(project_f03[,x]) && project_f03[,x]==4,x]
应该消除逻辑冲突。优点:不太难,我知道它有效。缺点:很多额外的代码,看起来像是一个杂物。 - 最后,我可以将逻辑从 更改
project_f03[project_f03[,x]==4,x] <- 5
为project_f03[project_f03[,x] %in% 4,x] <- 5
。这似乎工作正常,但我不确定这是否是一个好习惯,并想得到一些想法。优点:快速解决此问题并且似乎有效;保留“blah blah LOGIC blah <- bleh”的一般句法流程。缺点:可能会产生黑洞?不确定使用%in%
这样的潜在影响可能是什么。
编辑清楚
这个问题有一个主要组成部分:%in%
在进行逻辑运算时使用上述第三点是否安全,或者是否有理由不这样做?
第二个组成部分是:有哪些推荐的反转值的方法,就像答案和评论中描述的那样?