ifelse在R中的行相同

时间:2013-07-20 13:55:27

标签: r if-statement

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

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

我正在尝试基于df中的行值创建“D”列,其中如果行中的值不同(即行2)或所有NA(即行1),则D获得NA,并且如果该行中的值相同,则排除行中的值,排除NAs(即行3,4,5)。这将生成一个如下所示的矢量和数据框:

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

提前感谢您的建议。

2 个答案:

答案 0 :(得分:6)

您可以使用apply()为每行进行计算,然后使用unique()!is.na()。使用!is.na(),您可以选择非NA的值。使用unique(),您将获得唯一值,然后使用length()获取唯一值的数量。如果number为1,则使用第一个非NA值,否则使用NA。

df$D<-apply(df,1,function(x) 
  ifelse(length(unique(x[!is.na(x)]))==1,x[!is.na(x)][1],NA)) 

答案 1 :(得分:0)

这是一种可能的方法:

FUN <- function(x) {
    no.na <- x[!is.na(x)]
    len <- length(no.na)
    if (len == 0) return(NA)
    if (len == 1) return(no.na) 
    runs <- rle(no.na)[[2]]
    if(length(runs) > 1) return(NA)
    runs
}

df$D <- apply(df, 1, FUN)

## > df
##    A  B  C  D
## 1 NA NA NA NA
## 2  1  5 NA NA
## 3  2 NA NA  2
## 4  3  3 NA  3
## 5  4  4  4  4