条件计算:下一行不是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。然后对行 1
和 3
.
执行相同操作
所以第 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
我有以下 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。然后对行 1
和 3
.
所以第 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