首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >与数据表中以前的值比较行并填充间隙

与数据表中以前的值比较行并填充间隙
EN

Stack Overflow用户
提问于 2020-10-12 17:57:56
回答 2查看 171关注 0票数 1

我有一个数据表,看起来像这样:

代码语言:javascript
运行
复制
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))

现在我想用1来填充anom列中的空格(0),这样结果看起来就像这样:

代码语言:javascript
运行
复制
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),而不仅仅是NA,比如函数fillna.locf

EN

回答 2

Stack Overflow用户

发布于 2020-10-12 18:04:34

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

代码语言:javascript
运行
复制
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
票数 1
EN

Stack Overflow用户

发布于 2020-10-13 09:11:48

以下是使用滚动连接的另一种选择:

代码语言:javascript
运行
复制
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)
]

输出:

代码语言:javascript
运行
复制
    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
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64315581

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档