2

我有一个看起来像这样的数据框:

> 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,并且行,如果该行中的值相同,不包括 NA(即第 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

预先感谢您的建议。

4

2 回答 2

6

您可以使用apply()对每一行进行计算,然后使用unique()and !is.na()。与!is.na()您一起选择不是 NA 的值。随着unique()您获得唯一值,然后获得唯一值的length()数量。如果数字为 1,则使用第一个非 NA 值,如果不是,则使用 NA。

df$D<-apply(df,1,function(x) 
  ifelse(length(unique(x[!is.na(x)]))==1,x[!is.na(x)][1],NA)) 
于 2013-07-20T14:03:17.567 回答
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
于 2013-07-20T14:13:56.183 回答