2015-05-07 71 views
2

我正在嘗試根據其他三個變量的值對新變量進行編碼。具體來說,如果所有的變量都是NA,我希望新的變量取NA,如果它們中的任何一個是1,它應該取1,否則它應該取0.但是,我遇到一個錯誤,使用下面的代碼:在R中使用NAs重新編碼變量

frame <- data.frame(x = c(NA,NA,1), x2 = c(NA, NA, 0), x3 = c(NA,0,0)) 
frame 

y <- ifelse(is.na(frame$x) == TRUE & is.na(frame$x2) == TRUE & is.na(frame$x3) == TRUE, NA, 0) 
y2 <- ifelse(frame$x == 1 | frame$x2 == 1 | frame$x3 == 1, 1, y) 

y的第二個數字正確0,但在y2中引用時變爲NA。任何想法爲什麼發生這種情況?得到預期

+0

首先,'is.na(x)== TRUE'就相當於'is.na(x)'。兩者都是邏輯值,所以不需要'== TRUE'部分。 – cbare

回答

4

你有三個不同的條件,所以它是最自然的表達出來三行:

z <- rep(0,nrow(frame)) 

z[apply(is.na(frame),1,all)] <- NA 
z[apply(frame==1 ,1,any)] <- 1 
# [1] NA 0 1 
+0

OP對於代碼與「段落」中段落中提到的三個條件之間的聯繫很模糊。這對應於描述;我不知道該怎麼編碼。 – Frank

5

一種選擇輸出

do.call(pmax, c(frame, na.rm=TRUE)) 
    #[1] NA 0 1 
+0

我認爲OP想創建一個新變量而不是改變整個數據集。 –

+0

@DavidArenburg謝謝,我一定有誤讀 – akrun

+0

@akrun感謝您的迴應,但的確希望創建一個新變量。 –

1

如果你有一個像data.frame所以:

frame <- data.frame(a=letters[1:5], x1=c(1,1,NA,NA,0), x2=c(1,0,NA,0,0), x3=c(0,1,NA,1,0)) 

> frame 
    a x1 x2 x3 
1 a 1 1 0 
2 b 1 0 1 
3 c NA NA NA 
4 d NA 0 1 
5 e 0 0 0 

像這樣的東西可以做你以後:

frame$summary <- apply(frame[,c('x1','x2','x3')], 1, function(row) { 
    if (all(is.na(row))) { 
     return(NA) 
    } else if (1 %in% row) { 
     return(1) 
    } else { 
     return(0) 
    }}) 

> frame 
    a x1 x2 x3 summary 
1 a 1 1 0  1 
2 b 1 0 1  1 
3 c NA NA NA  NA 
4 d NA 0 1  1 
5 e 0 0 0  0 

...是一個相當直接的語言描述轉換爲代碼。

+1

Fyi,你需要所有的帽子:'TRUE' – Frank

+1

謝謝,太多的蟒蛇,這些天... – cbare