在 R 中使用 NA 重新编码变量
Recoding variables with NAs in R
我正在尝试根据其他三个变量的值编写一个新变量。具体来说,如果所有变量都是 NA,我希望新变量采用 NA,如果其中任何一个为 1,则应采用 1,否则应采用 0。但是,我在使用以下代码时遇到错误:
frame <- data.frame(x = c(NA,NA,1), x2 = c(NA, NA, 0), x3 = c(NA,0,0))
frame
y <- ifelse(is.na(frame$x) == TRUE & is.na(frame$x2) == TRUE & is.na(frame$x3) == TRUE, NA, 0)
y2 <- ifelse(frame$x == 1 | frame$x2 == 1 | frame$x3 == 1, 1, y)
y 的第二个数字正确地为 0,但在 y2 中引用时变为 NA。知道为什么会这样吗?
获得预期输出的一个选项是
do.call(pmax, c(frame, na.rm=TRUE))
#[1] NA 0 1
你有三个不同的条件,所以用三行来表达是最自然的:
z <- rep(0,nrow(frame))
z[apply(is.na(frame),1,all)] <- NA
z[apply(frame==1 ,1,any)] <- 1
# [1] NA 0 1
如果你有这样的data.frame:
frame <- data.frame(a=letters[1:5], x1=c(1,1,NA,NA,0), x2=c(1,0,NA,0,0), x3=c(0,1,NA,1,0))
> frame
a x1 x2 x3
1 a 1 1 0
2 b 1 0 1
3 c NA NA NA
4 d NA 0 1
5 e 0 0 0
类似这样的东西可能会满足您的需求:
frame$summary <- apply(frame[,c('x1','x2','x3')], 1, function(row) {
if (all(is.na(row))) {
return(NA)
} else if (1 %in% row) {
return(1)
} else {
return(0)
}})
> frame
a x1 x2 x3 summary
1 a 1 1 0 1
2 b 1 0 1 1
3 c NA NA NA NA
4 d NA 0 1 1
5 e 0 0 0 0
...并且是将您的口头描述相当直接地翻译成代码。
我正在尝试根据其他三个变量的值编写一个新变量。具体来说,如果所有变量都是 NA,我希望新变量采用 NA,如果其中任何一个为 1,则应采用 1,否则应采用 0。但是,我在使用以下代码时遇到错误:
frame <- data.frame(x = c(NA,NA,1), x2 = c(NA, NA, 0), x3 = c(NA,0,0))
frame
y <- ifelse(is.na(frame$x) == TRUE & is.na(frame$x2) == TRUE & is.na(frame$x3) == TRUE, NA, 0)
y2 <- ifelse(frame$x == 1 | frame$x2 == 1 | frame$x3 == 1, 1, y)
y 的第二个数字正确地为 0,但在 y2 中引用时变为 NA。知道为什么会这样吗?
获得预期输出的一个选项是
do.call(pmax, c(frame, na.rm=TRUE))
#[1] NA 0 1
你有三个不同的条件,所以用三行来表达是最自然的:
z <- rep(0,nrow(frame))
z[apply(is.na(frame),1,all)] <- NA
z[apply(frame==1 ,1,any)] <- 1
# [1] NA 0 1
如果你有这样的data.frame:
frame <- data.frame(a=letters[1:5], x1=c(1,1,NA,NA,0), x2=c(1,0,NA,0,0), x3=c(0,1,NA,1,0))
> frame
a x1 x2 x3
1 a 1 1 0
2 b 1 0 1
3 c NA NA NA
4 d NA 0 1
5 e 0 0 0
类似这样的东西可能会满足您的需求:
frame$summary <- apply(frame[,c('x1','x2','x3')], 1, function(row) {
if (all(is.na(row))) {
return(NA)
} else if (1 %in% row) {
return(1)
} else {
return(0)
}})
> frame
a x1 x2 x3 summary
1 a 1 1 0 1
2 b 1 0 1 1
3 c NA NA NA NA
4 d NA 0 1 1
5 e 0 0 0 0
...并且是将您的口头描述相当直接地翻译成代码。