我有一个包含多列的数据框。一些数据丢失(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值。
答案 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
根据我的测试,这两种方法的速度相似。