我有一个如下所示的数据框:
> 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
提前感谢您的建议。
答案 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