另一个骨头请求。我试图使用重新编码的变量创建列联表,其中任何答案编码为“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,这将非常有帮助。谢谢!
答案 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
要一次执行多个列,请使用plyr
,colwise
,catcolwise
和numcolwise
中的函数。这些按列逐列应用于离散数据,逐列用于数值数据
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