【问题标题】:Recoding variables with NAs in R在 R 中使用 NA 重新编码变量
【发布时间】:2015-05-07 17:46:48
【问题描述】:

我正在尝试根据其他三个变量的值编写一个新变量。具体来说,如果所有变量都是 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。知道为什么会这样吗?

【问题讨论】:

  • 首先,is.na(x) == TRUE 等同于 is.na(x)。两者都是逻辑值,因此不需要 == TRUE 部分。

标签: r na recode


【解决方案1】:

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

  do.call(pmax, c(frame, na.rm=TRUE))
  #[1] NA  0  1

【讨论】:

  • 我认为 OP 想要创建一个新变量而不是更改整个数据集。
  • @akrun 感谢您的回复,但确实想创建一个新变量。
  • @user2154571 你能把结果分配给y &lt;- do.call(pmax, c(frame, na.rm=TRUE)) 还是我不太明白你想要什么
  • @user2154571 你的正确输出是什么?虽然弗兰克斯的输出和我的一样
  • @user2154571 如果您的数据集中只有零、NA 或 1,则此解决方案是您能获得的最佳解决方案。
【解决方案2】:

你有三个不同的条件,所以用三行来表达是最自然的:

z <- rep(0,nrow(frame))

z[apply(is.na(frame),1,all)] <- NA
z[apply(frame==1    ,1,any)] <- 1
# [1] NA  0  1

【讨论】:

  • OP 对代码与“新变量”段落中概述的三个条件之间的联系含糊不清。这对应于描述;我不知道如何处理代码。
【解决方案3】:

如果你有这样的 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

...并且是将您的口头描述相当直接地翻译成代码。

【讨论】:

  • 仅供参考,您需要全部大写:TRUE
猜你喜欢
  • 2013-07-07
  • 1970-01-01
  • 2019-01-21
  • 1970-01-01
  • 1970-01-01
  • 2023-04-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多