我有两个列表(来自多波调查),看起来像这样:
X1 X2
1 NA
NA 2
NA NA如何轻松地将其合并到第三项中,其中第三列始终采用列X1或X2的非NA值,并在这两个值都为NA时编码NA?
发布于 2011-01-11 23:15:26
结合Gavin对within的使用和Prasad对ifelse的使用,我们得到了一个更简单的答案。
within(df, x3 <- ifelse(is.na(x1), x2, x1))不需要多个ifelse调用--当两个值都为NA时,您可以直接获取其中一个值。
发布于 2011-01-11 22:48:43
使用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-11 22:38:13
这需要一些额外的技巧,因为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 NAhttps://stackoverflow.com/questions/4658538
复制相似问题