用R中的ifelse()用NAs重新编码变量

时间:2013-07-09 17:25:44

标签: r if-statement

我正在将两个二进制变量重新编码为新变量,以使第一个变量中的任何1在新变量中取0,并保留第二个变量中的所有数字。下面的代码显示了我想要生成的逻辑。但是,当我运行此代码时,使用ifelse()的重新编码只是重新创建x2而不包含使用x1的1为0的第一条ifelse()行。想法?

set.seed(123)
x1 <- sample(c(0,1,NA), 20, replace = TRUE)
x2 <- sample(c(0,1,NA), 20, replace = TRUE)

recode <- ifelse(x1 == 1, 0, NA)
recode <- ifelse(x2 == 1, 1, recode)
recode <- ifelse(x2 == 0, 0, recode)

table(recode); table(x2)

由于

4 个答案:

答案 0 :(得分:4)

很抱歉,但它可以做你想做的事。您可能已经忘记的问题是NA与任何内容的比较结果也是NA,因此如果ifelse( x2 == 0, yes, no ) no返回NA(而不是x2 == NA)。

更好的尝试

recode <- rep( NA, length( x1 ) )
recode[ x1 == 1 ] <- 0
recode[ ! is.na( x2 ) ] <- x2[ ! is.na( x2 ) ]

答案 1 :(得分:3)

也许你想要这个?

ifelse(is.na(x2), ifelse(x1 == 1, 0, NA), x2)

答案 2 :(得分:2)

你覆盖了那些结果。帮助('ifelse')页面的详细信息部分中的相关行是:

 Missing values in test give missing values in the result.

recode <- ifelse(x1 == 1, 0, NA)
recode[ !is.na(x2)] <- x2[!is.na(x2)]

答案 3 :(得分:0)

我发布这个只是为了弄清楚是否有一些原因没有建议这个衬垫:

recode <- ifelse(x1 %in% 1 & is.na(x2), 0, x2)