我有兩個列表(從多波勘探)看起來像這樣:結合調查項目在R /重新編碼來港
X1 X2
1 NA
NA 2
NA NA
我如何可以很容易地結合到這第三個項目,其中第三列總是取列X1或X2的非NA值,並且當兩個值都是NA時編碼NA?
我有兩個列表(從多波勘探)看起來像這樣:結合調查項目在R /重新編碼來港
X1 X2
1 NA
NA 2
NA NA
我如何可以很容易地結合到這第三個項目,其中第三列總是取列X1或X2的非NA值,並且當兩個值都是NA時編碼NA?
結合加文的使用within
和普拉薩德的使用ifelse
給了我們一個簡單的答案。不需要
within(df, x3 <- ifelse(is.na(x1), x2, x1))
多ifelse
電話 - 在雙方的值NA
,你可以採取直接的一個值。
這需要一點點額外的技巧-ING由於雙方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
使用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
你沒有說你想什麼做當兩個是有效的號碼,但您可以使用PMAX或PMIN與na.rm說法:
pmax(df$x1, df$x2, na.rm=TRUE)
# [1] 1 2 NA 4
+1點好@Richie – 2011-01-11 15:32:44