3

私は次のような2つのリスト(マルチウェーブ調査から)を持っています:

X1 X2
1  NA
NA  2
NA  NA

これを3番目の項目に簡単に組み合わせるにはどうすればよいですか。3番目の列は常に列X1またはX2の非NA値を取り、両方の値がNAの場合はNAをコーディングします。

4

4 に答える 4

5

Gavinの使用withinとPrasadの使用を組み合わせるとifelse、より簡単な答えが得られます。

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

複数ifelseの呼び出しは必要ありません-両方の値がNAの場合、値の1つを直接取得できます。

于 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

両方が有効な数値であるときに何をしたいのかを言いませんでしたが、na.rm引数でpmaxまたはpminのいずれかを使用できます。

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