[英]How to get the first non-NA date for each row and add it as a new column in the data frame below in r?
[英]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.