如何连续查找第一个非NA值?

问题描述 投票:0回答:1

假设我有以下内容:

df <- data.frame(dt=c(as.Date('2019-02-02'), as.Date('2019-02-04'), as.Date('2019-02-05'), as.Date('2020-03-04')), v1=c(1,2,NA,NA), v2=c(NA,3,4,NA), v3=c(NA,NA,3,5), v4=c(2, 4, 6, NA))
> read.zoo(df)
           v1 v2 v3 v4
2019-02-02  1 NA NA  2
2019-02-04  2  3 NA  4
2019-02-05 NA  4  3  6
2020-03-04 NA NA  5 NA

我想在具有值的列之后的每一行上找到第一个非NA值。

例如,对于'2019-02-02':

  • v1中有一个值1,v2有NA,所以我们跳过,v3有NA,所以我们跳过,但是v4不是NA,所以我想返回其值,第1行,col 1.
  • 在同一行中查看下一行v2,它是NA,因此我们跳过它,因为它不是数字
  • v3也是NA,所以我们跳过它。
  • v4不是NA,但是后面没有列,因此我们返回NA。

因此,我们的第一行将是:

c1 c2 c3 c4
2  NA NA NA

遍历此示例中的所有行,我希望输出为:

             c1 c2 c3 c4
1 2019-02-02  2 NA NA NA
2 2019-02-04  3  4 NA NA
3 2019-02-05 NA  3  6 NA
4 2020-03-04 NA NA NA NA

看来我需要做的就是将每一行中的列值向左移动,但我似乎不知道该怎么做...

注意:我希望使用Zoo的base-R解决方案

r dataframe zoo
1个回答
0
投票

这是一个应用自定义功能的解决方案:

res = t(apply(df[-1], 1, function(x) {
     val = which(!is.na(x))
     x[val[-length(val)]] = x[val[-1]]
     x[val[length(val)]] = NA
     return(x)
     }
  ))

cbind(df[1], res)
#           dt v1 v2 v3 v4
# 1 2019-02-02  2 NA NA NA
# 2 2019-02-04  3  4 NA NA
# 3 2019-02-05 NA  3  6 NA
# 4 2020-03-04 NA NA NA NA
© www.soinside.com 2019 - 2024. All rights reserved.