【问题标题】:compare rows and fill gaps with previous values in a data table比较行并用数据表中的先前值填充空白
【发布时间】:2021-01-26 15:11:11
【问题描述】:

我的数据表如下所示:

library(data.table)
data <- data.table(time = c(seq(0, 14)),
                   anom = c(0, 0, 0, 1, 1, 1, 0, 0, 1, 0, 1, 1, 0, 0, 0),
                   gier = c(0, 0, 0, 4, 9, 7, 2, 0, 3, 1, 4, 2, 0, 0, 0))

现在我想用anom 列中的空格(零)填充,这样结果如下所示:

res <- data.table(time = c(seq(0, 14)),
                  anom = c(0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0),
                  gier = c(0, 0, 0, 4, 9, 7, 2, 0, 3, 1, 4, 2, 0, 0, 0))

此外,还有一个问题是我想灵活调整间隙大小,以便我可以选择间隙的大小。必须有一种简单的方法来执行类似于 LOCF 的操作,仅用于实际值(可能用行的前一个值填充它,而不仅仅是 1 或 0),而不仅仅是像函数 fillna.locf 这样的 NA。

【问题讨论】:

  • @Ronak Shah,没关系。对我来说,设置间隙大小很重要。在大多数情况下,最终值有很多零。通过设置间隙大小,我可以排除它们。

标签: r time-series data.table lag shift


【解决方案1】:

使用 maxgap 参数选择最大间隙大小的示例

library(zoo)
na.fill(
  na.locf(
    replace(data$anom,data$anom==0,NA),
    na.rm=F,
    maxgap=2
  ),0
)

 [1] 0 0 0 1 1 1 1 1 1 1 1 1 0 0 0

【讨论】:

  • 这已经很好用了。有没有更多的“data.table”方式来做到这一点?
【解决方案2】:

这是使用滚动连接的另一个选项:

maxgap <- 1L
data[, c("rn", "lu") := .(.I, anom)]
data[anom==0L, lu := fcoalesce(
    data[anom!=0L][.SD, on=.(rn=rn), roll=maxgap, rollends=c(FALSE, FALSE), x.anom],
    anom)
]

输出:

    time anom gier rn lu
 1:    0    0    0  1  0
 2:    1    0    0  2  0
 3:    2    0    0  3  0
 4:    3    1    4  4  1
 5:    4    1    9  5  1
 6:    5    1    7  6  1
 7:    6    0    2  7  1
 8:    7    0    0  8  0
 9:    8    1    3  9  1
10:    9    0    1 10  1
11:   10    1    4 11  1
12:   11    1    2 12  1
13:   12    0    0 13  0
14:   13    0    0 14  0
15:   14    0    0 15  0

【讨论】:

    猜你喜欢
    • 2018-12-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-01
    • 2021-10-19
    • 2022-12-11
    • 1970-01-01
    相关资源
    最近更新 更多