结合R /重新编码NA中的调查项目

时间:2011-01-11 14:17:02

标签: r survey

我有两个列表(来自多波调查),如下所示:

X1 X2
1  NA
NA  2
NA  NA

如何轻松地将其组合成第三项,其中第三列始终采用列X1或X2的非NA值,并在两个值均为NA时编码NA?

4 个答案:

答案 0 :(得分:5)

结合Gavin使用within和Prasad使用ifelse为我们提供了一个更简单的答案。

within(df, x3 <- ifelse(is.na(x1), x2, x1))

不需要多次ifelse次调用 - 当两个值均为NA时,您可以直接获取其中一个值。

答案 1 :(得分:3)

使用ifelse的另一种方式:

df <- data.frame(x1 = c(1, NA, NA, 3), x2 = c(NA, 2, NA, 4))
> df
  x1 x2
1  1 NA
2 NA  2
3 NA NA
4  3  4

> transform(df, x3 = ifelse(is.na(x1), ifelse(is.na(x2), NA, x2), x1))
  x1 x2 x3
1  1 NA  1
2 NA  2  2
3 NA NA NA
4  3  4  3

答案 2 :(得分:2)

由于X1X2可能NA的可能性,这需要一点额外的精细化,但此功能可用于解决您的问题:

foo <- function(x) {
    if(all(nas <- is.na(x))) {
        NA
    } else {
        x[!nas]
    }
}

我们使用函数foo将其应用于数据的每一行(此处我的数据位于名为dat的对象中):

> apply(dat, 1, foo)
[1]  1  2 NA

所以这给了我们想要的东西。要将其包含在对象中,我们会这样做:

> dat <- within(dat, X3 <- apply(dat, 1, foo))
> dat
  X1 X2 X3
1  1 NA  1
2 NA  2  2
3 NA NA NA

答案 3 :(得分:0)

当两者都是有效数字时,你没有说你想要做什么,但你可以使用pmax或pmin和na.rm参数:

 pmax(df$x1, df$x2, na.rm=TRUE)
# [1]  1  2 NA  4