繁体   English   中英

查找数据框中特定列的第一个NON-NA的索引

[英]Finding index of a first NON-NA for a specific column in data frame

我有一个包含多列的数据框。 某些数据丢失(NA)。 我按一列对数据帧进行了排序,现在数据已正确排序,但NA却作为最后一个值排序。 我想获取最后一个非na值的索引。

column1 column2
1       2
2       na
3       some data
4       some data
na      some data
na      some data
na      some data

所以我想得到4的索引。

which(is.na(DF))

但它似乎没有返回na值。

我被这个线程吸引了,因为我需要在数据帧的每一列中找到第一个非NA。 即使最初的问题实际上是关于查找列中的最后一个非NA,但我仍然能够找出如何从其他人的答案中找到第一个非NA。 如果有人想知道同一件事,我在下面列出了两者。

这是示例数据。 请注意,这些列应该已经在每列的开头或结尾处用NA进行了排序。

(df <- data.frame(c=c(NA,NA,13,14,15), 
             d=c(16,17,NA,NA,NA), 
             e=c(NA,NA,NA,NA,NA), 
             f=c(18,19,20,21,22)))
   c  d  e  f
1 NA 16 NA 18
2 NA 17 NA 19
3 13 NA NA 20
4 14 NA NA 21
5 15 NA NA 22

在每列中找到第一个非NA的两种方法。 首先是使用for循环

x1 <- vector("numeric")
for (j in 1:ncol(df)) {
  x1[j]<-df[,j] [min(which(!is.na(df[,j])))]
}

> x1
[1] 13 16 NA 18

或使用sapply。 complete.cases在向量上的作用与!is.na相同。

(x2 <- sapply(seq_len(ncol(df)), function(x) df[,x] [min(which(!is.na(df[,x])))]))
[1] 13 16 NA 18
(x3 <- sapply(seq_len(ncol(df)), function(x) df[,x] [min(which(complete.cases(df[,x])))]))
[1] 13 16 NA 18

同样,有两种查找最后一个非NA的方法。

y1 <- vector("numeric")
for (j in 1:ncol(df)) {
  y1[j] <- df[,j][max(which(!is.na(df[,j])))]
}
> y1
[1] 15 17 NA 22

(y2 <- sapply(seq_len(ncol(df)), function(x) df[,x] [max(which(!is.na(df[,x])))]))
[1] 15 17 NA 22
(y3 <- sapply(seq_len(ncol(df)), function(x) df[,x] [max(which(complete.cases(df[,x])))]))
[1] 15 17 NA 22

根据我的测试,两种方法的速度相似。

似乎您需要此表达式:

max(which(complete.cases(DF$column1)))

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM