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

时间:2014-06-01 16:09:09

标签: r dataframe

我有一个包含多列的数据框。一些数据丢失(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值。

2 个答案:

答案 0 :(得分:1)

您似乎想要这个表达式:

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

答案 1 :(得分:1)

我被这个帖子所吸引,因为我需要在数据帧的每一列中找到第一个非NA。尽管最初的问题实际上是关于在列中找到最后一个非NA,但我能够弄清楚如何从其他人那里找到第一个非NA'答案。我在下面列出了以防万一有人想知道同样的事情。

以下是示例数据。请注意,列应该在每列的开头或结尾用NAs排序。

(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

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