0

另一个愚蠢的请求。我正在尝试使用重新编码的变量创建列联表,其中任何答案都编码为“1”,非答案编码为“0”。

我的原始数据可能看起来像这样:一些变量是从字符串重新编码的,而另一些是从数字重新编码的。

id   var1       recode    var2    recode2  ...   var250   recode250
1    "hello"     1         1         1     ... 
2    "hi"        1         <NA>      0     ...
3                0         <NA>      0     ... 
4     "hola"     1         1         1     ...  

我已经编写了一些代码来对字符串进行重新编码,我使用列联表进行检查。

data$recode <- ifelse((as.numeric(data$var1)!=1), 1, 0) #RECODES STRINGS
table(data$recode)
    0     1
    1     3

但是,我还需要将所有其他变量中的 NA 重新编码为 0。我尝试使用另一个 ifelse 语句来做到这一点:

 data <- ifelse(is.na(data), 0, 1)

这些值似乎发生了变化,但现在当我尝试运行相同的列联表时,我收到以下错误消息:

  Error in data$recode : $ operator is invalid for atomic vectors

手头的关键问题是我需要能够为我的所有变量(即报告百分比和频率)生成列联表,因此有助于如何正确地将我的所有 NA(在一系列列内)重新编码为 0 所以会很有帮助。谢谢!

4

1 回答 1

0

我认为您想强制data$var1字符,然后计算字符而不是使用as.numeric. logical您还可以使用变量是二进制 的事实,as.numeric(c(TRUE, FALSE))将给出c(1, 0).

data <- data.frame(var1 = c('hello','hi','','lola'), 
                   var2 = c(1,NA,NA,1))

data$recode_1 <- as.numeric(nchar(as.character(data$var1)) > 0)
data$recode_2 <- as.numeric(!is.na(data$var2))
data


##    var1 var2 recode_1 recode_2
## 1 hello    1        1        1
## 2    hi   NA        1        0
## 3         NA        0        0
## 4  lola    1        1        1

编辑——处理多列

要一次处理多列,请使用、plyr和中的函数。这些应用函数按列,按列分别用于离散数据,按列分别用于数值数据colwisecatcolwisenumcolwise

library(plyr)                   
recode_character <- function(.col){
 as.numeric(nchar(as.character(.col)) > 0 )
}

recode_numeric <- function(.col){
  as.numeric(!is.na(.col))
}
data_more <- data.frame(var1 = c('hello','hi','','lola'), var2 = c(1,NA,NA,1), var3 = c(1,1,NA,NA), var4 = c('again','with','','Missing'))

recoded_data <- cbind(catcolwise(recode_character)(data_more),
      numcolwise(recode_numeric)(data_more))

recoded_data

##   var1 var4 var2 var3
## 1    1    1    1    1
## 2    1    1    0    1
## 3    0    0    0    0
## 4    1    1    1    0
于 2012-07-16T23:35:37.060 回答