2013-07-19 148 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]) 

可能会快一点,如果列数很大。