我有两个列表(来自多波调查),如下所示:
X1 X2
1 NA
NA 2
NA NA
如何轻松地将其组合成第三项,其中第三列始终采用列X1或X2的非NA值,并在两个值均为NA时编码NA?
答案 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)
由于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
答案 3 :(得分:0)
当两者都是有效数字时,你没有说你想要做什么,但你可以使用pmax或pmin和na.rm参数:
pmax(df$x1, df$x2, na.rm=TRUE)
# [1] 1 2 NA 4