私は次のような2つのリスト(マルチウェーブ調査から)を持っています:
X1 X2
1 NA
NA 2
NA NA
これを3番目の項目に簡単に組み合わせるにはどうすればよいですか。3番目の列は常に列X1またはX2の非NA値を取り、両方の値がNAの場合はNAをコーディングします。
Gavinの使用within
とPrasadの使用を組み合わせるとifelse
、より簡単な答えが得られます。
within(df, x3 <- ifelse(is.na(x1), x2, x1))
複数ifelse
の呼び出しは必要ありません-両方の値がNA
の場合、値の1つを直接取得できます。
を使用する別の方法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
両方が有効な数値であるときに何をしたいのかを言いませんでしたが、na.rm引数でpmaxまたはpminのいずれかを使用できます。
pmax(df$x1, df$x2, na.rm=TRUE)
# [1] 1 2 NA 4