条件计算:下一行不是NA值时某行的长度

conditional calculation: length of certain row when row below is not NA value

我有以下 df:

           X7 X8   X9 X10 X11  X12  X13  X14  
1          1  1 <NA>   1   1    1    1  <NA>    
2          1  1    1   1   1    1  <NA> <NA> 
3          1  1    1   1   1  <NA> <NA> <NA>  

编辑: 使用:

df <- data.frame(X7=c(1L,1L,1L),X8=c(1L,1L,1L),X9=factor(c(NA,'1','1')),X10=c(1L,1L,1L),X11=c(1L,1L,1L),X12=factor(c('1','1',NA)),X13=factor(c('1',NA,NA)),X14=factor(c(NA,NA,NA)));

当行 2 中的值不是 NA 值时,我想计算行 1 的长度,不包括 NA。然后对行 13.

执行相同操作

所以第 1-2 行的结果应该是 5,第 1-3 行的结果应该是 4。

除了知道如何计算每一行的长度外,我不知道如何去做:

(apply(df, MARGIN = 1, FUN = function(x) length(x[!is.na(x)])))

如有任何帮助,我们将不胜感激!

我会预先计算一个逻辑矩阵,表示哪些单元格是 not NA,然后使用 sapply() 调用遍历第一个以外的所有行索引。在 lambda 中,您可以在当前行和第一行之间进行逻辑与以获得常见的非 NA,然后使用 sum() 来计算有多少。

df <- data.frame(X7=c(1L,1L,1L),X8=c(1L,1L,1L),X9=factor(c(NA,'1','1')),X10=c(1L,1L,1L),X11=c(1L,1L,1L),X12=factor(c('1','1',NA)),X13=factor(c('1',NA,NA)),X14=factor(c(NA,NA,NA)));
nons <- !is.na(df);
sapply(seq(2L,len=nrow(df)-1L),function(ri) sum(nons[1L,]&nons[ri,]));
## [1] 5 4

或者,您可以预先计算第一行中具有非 NA 的列索引,然后从 lambda 内部调用 intersect() 针对当前行中具有非 NA 的索引。

nons <- !is.na(df);
nons1 <- unname(which(nons[1L,]));
sapply(seq(2L,len=nrow(df)-1L),function(ri) length(intersect(nons1,which(nons[ri,]))));
## [1] 5 4