1

我正在为工作中的心理测量仪器评分,并想重新编码一些变量。基本上,每个问题都有五个可能的答案,分别为 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] <- 5project_f03[project_f03[,x] %in% 4,x] <- 5。这似乎工作正常,但我不确定这是否是一个好习惯,并想得到一些想法。优点:快速解决此问题并且似乎有效;保留“blah blah LOGIC blah <- bleh”的一般句法流程。缺点:可能会产生黑洞?不确定使用%in%这样的潜在影响可能是什么。

编辑清楚

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

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

4

2 回答 2

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]
于 2012-10-01T19:33:30.250 回答
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 建议的那样,您可以将 for 循环中的整个代码块替换为project_f03[,x] <- rev(0:4)[match(project_f03[,x], 0:4, nomatch=10)]. 它应该保留NA. 并且可能有更多的机会来简化代码。

于 2012-10-02T18:15:57.523 回答