我有两个列表(来自多波调查),如下所示:
X1 X2
1 NA
NA 2
NA NA
我怎样才能轻松地将它组合成第三项,其中第三列总是取 X1 或 X2 列的非 NA 值,并且当两个值都是 NA 时编码 NA?
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.
另一种使用方式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
由于可能同时存在X1
和,这需要一些额外的技巧,但是此功能可用于解决您的问题:X2
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
当两者都是有效数字时,您没有说您想要做什么,但是您可以将 pmax 或 pmin 与 na.rm 参数一起使用:
pmax(df$x1, df$x2, na.rm=TRUE)
# [1] 1 2 NA 4