r中的ifelse匹配向量

r中的ifelse匹配向量,r,if-statement,R,If Statement,我有一个如下所示的数据帧: > 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$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

我有一个如下所示的数据帧:

> 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$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
>测向
A、B、C
1NA NA NA
2 1 5 NA
3  2  2  2
436 NA
54NA
我想使用此df的行值创建第四个“D”列,基于以下2个条件:1)如果行中的所有值都相同(不包括NAs),则将该“相同”值分配给列D;2) 如果值不同,则将A列中的值指定给D列。这将创建如下所示的向量和数据帧:

> 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$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
>df$D df
A、B、C、D
1不,不,不,不
2 1 5 NA 1
3  2  2  2  2
4 3 6 NA 3
5 4 NA 4
以下内容应该有效(使用@flodel建议的修订示例):

df以下内容应该有效(使用@flodel建议的修订示例):


df基于@James answer,我相信

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

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

基于@James answer,我相信

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

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

这与
df$D@HongOoi和upvorters有何不同,如果我读得正确,一行“NA 5 5”将给出
5
,而不是
a
列中的值。不过,OP应该给出一个更好的例子来说明这个特殊情况。@flodel是正确的;我为这个糟糕的例子道歉。这与仅仅
df$D@HongOoi和upvorters有什么不同?如果我读对了,一行加上“NA 5 5”将给出
5
,而不是
a
列中的值。不过,OP应该给出一个更好的例子来说明这个特殊情况。@flodel是正确的;我为这个糟糕的例子道歉。+1-我在这里看到的唯一问题是使用
x[1]
,也就是说,你假设列
“A”
在第一位。@flodel如果是这样的话,那么用
x[名称(df)=“A”)
替换
x[这(名称(df)=“A”)
,但最好是在
apply
loop+1之外计算并存储它-我在这里看到的唯一问题是使用
x[1]
,即假设列
“A”
位于第一位。@flodel如果是这样的话,那么用
x[name(df)=“A”)替换
x[code>
会起作用,但最好在
apply
循环之外计算并存储它