我正在将两个二进制变量重新编码为新变量,以使第一个变量中的任何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)
由于
答案 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)