2013-07-19 151 views
0

匹配矢量我有一個數據幀,看起來像這樣:ifelse r中

> df<-data.frame(A=c(NA,1,2,3,4),B=c(NA,5,2,6,4),C=c(NA,NA,2,NA,NA)) 
> df 
    A B C 
1 NA NA NA 
2 1 5 NA 
3 2 2 2 
4 3 6 NA 
5 4 4 NA 

我想用行值這個df,可以創建一個4「d」欄目,基於以下2個條件:1 )如果行中的所有值相同(不包括NA),則將該「相同」值分配給列D; 2)如果值不同,則在A列中的值分配給塔D.這將產生一個向量和數據幀,看起來像這樣:

> df$D<-c(NA,1,2,3,4) 
> df 
    A B C D 
1 NA NA NA NA 
2 1 5 NA 1 
3 2 2 2 2 
4 3 6 NA 3 
5 4 4 NA 4 
+6

這與df $ D < - df $ A'有什麼不同? –

+4

@HongOoi和upvoters,如果我正確閱讀,一行「NA 5 5」會給出一個不是'A'列中值的'5'。儘管如此,OP應該給出一個更好的例子來說明這個特殊情況。 – flodel

+0

@ flodel是正確的;我爲這個不好的例子道歉。 –

回答

3

以下應該工作(與由@flodel建議修訂示例):

df <- rbind(df,c(NA,5,5)) 

apply(df,1,function(x) {y<-x[!is.na(x)];if(length(unique(y))==1) unique(y) else x[1]}) 
1 2 3 4 5 6 
NA 1 2 3 4 5 
+1

+1 - 我在這裏看到的唯一問題是使用'x [1]',即您假定列「A」處於第一位置。 – flodel

+2

@flodel如果是這種情況,用'x [which(names(df)==「A」)]'替換'x [1]'會起作用,但計算並將其存儲在'應用'循環 – James

1

基於@詹姆斯的答案,我相信

apply(df,1,function(x) if(anyDuplicated(x)) x[which.min(is.na(x))] else x[1]) 

可能會快一點,如果列數很大。