【发布时间】:2020-02-24 21:42:57
【问题描述】:
假设我有以下内容:
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 行为 2,第 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 解决方案
【问题讨论】:
-
看来
v1没关系——这样对吗? -
这很重要,因为如果
v1是 NA,那么c1在该行中将是 NA(因为我们跳过了 NA)。如果v1不是NA,那么c1可能具有来自v1右侧某个列的值(如果v1右侧的某个列不是NA) -
啊,“将每行中的列值向左移动”的描述是有道理的。
-
:-) 解释这个问题有点难,但这让我很吃惊……