在R中使用NAs重新编码变量

在R中使用NAs重新编码变量,r,na,recode,R,Na,Recode,我试图根据其他三个变量的值编写一个新变量。具体地说,如果所有变量都是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

我试图根据其他三个变量的值编写一个新变量。具体地说,如果所有变量都是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)

frame获得预期输出的一个选项是

  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

z如果您有这样一个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
帧
一个x1x2x3
1A 110
2b101
3c-NA-NA-NA
4dNa01
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
frame$摘要框架
x1x2x3摘要
1A 110 1
2b1011
3c-NA-NA-NA
4dNA011
5 e 0 0 0 0

…是您口头描述到代码的相当直接的翻译。

我认为OP想要创建一个新变量,而不是更改整个数据集。@akrun感谢您的回答,但确实想要创建一个新变量。@user2154571您能不能将结果分配给
y@user2154571您的正确输出是什么?虽然Franks的产量与mine@user2154571如果您的数据集中只有零、NA或1,则此解决方案是您所能得到的最佳解决方案。OP对于代码与“新变量”段落中概述的三个条件之间的关系是模糊的。这与描述相对应;我不知道如何理解代码。仅供参考,你需要所有的大写:
TRUE
首先,
is.na(x)==TRUE
相当于
is.na(x)
。两者都是逻辑值,因此不需要
==TRUE
部分。