我正在为工作中的心理测量仪器打分,并希望重新编码一些变量。基本上,每个问题都有五个可能的响应,分别为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
。杜 - 忘了基本规则!
我提出了三种选择,但我不确定哪种选择最好。
project_f03[!is.na(project_f03[,x]) && project_f03[,x]==4,x]
应该消除逻辑冲突。优点:不太难,我知道它有效。缺点:许多额外的代码,似乎是一个kludge。project_f03[project_f03[,x]==4,x] <- 5
来
project_f03[project_f03[,x] %in% 4,x] <- 5
。这似乎工作正常,但我不确定这是一个好习惯,并想得到想法。优点:快速解决这个问题,似乎工作;保留“blah blah LOGIC blah&lt; - bleh”的一般合成流程。缺点:可能会造成黑洞?不确定使用%in%
这样的潜在影响可能是什么。编辑清除
这个问题有一个主要组成部分:在进行逻辑操作时,如上面第三点所述,使用%in%
是否安全,或者有理由不这样做?
第二个组成部分是:推荐哪些方法来反转这些值,就像有些人在答案和评论中所描述的那样?
答案 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
值的情况下,我会使用which
:project_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
。并且可能有更多机会来简化代码。