3

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

X1 X2
1  NA
NA  2
NA  NA

我怎样才能轻松地将它组合成第三项,其中第三列总是取 X1 或 X2 列的非 NA 值,并且当两个值都是 NA 时编码 NA?

4

4 回答 4

5

Combining Gavin's use of within and Prasad's use of ifelse gives us a simpler answer.

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

Multiple ifelse calls are not needed - when both values are NA, you can just take one of the values directly.

于 2011-01-11T15:15:26.290 回答
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
于 2011-01-11T14:48:42.857 回答
2

由于可能同时存在X1和,这需要一些额外的技巧,但是此功能可用于解决您的问题:X2NA

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
于 2011-01-11T14:38:13.440 回答
0

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

 pmax(df$x1, df$x2, na.rm=TRUE)
# [1]  1  2 NA  4
于 2011-01-11T22:21:58.620 回答