从重新编码的变量(原子向量)创建列联表

时间:2012-07-16 23:15:21

标签: r

另一个骨头请求。我试图使用重新编码的变量创建列联表,其中任何答案编码为“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,这将非常有帮助。谢谢!

1 个答案:

答案 0 :(得分: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

编辑 - 处理多列

要一次执行多个列,请使用plyrcolwisecatcolwisenumcolwise中的函数。这些按列逐列应用于离散数据,逐列用于数值数据

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