首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >在R中的数据表中展开组内的上一次观察值

在R中的数据表中展开组内的上一次观察值
EN

Stack Overflow用户
提问于 2018-06-04 16:50:02
回答 2查看 62关注 0票数 1

想象一下R中的data.table是这样的:

代码语言:javascript
复制
dtable = data.table(
  id = c(1, 1, 1, 2, 2, 2),
  time = c(1, 2, 3, 2, 3, 4),
  value_a = c(NA, 'Yes', NA, 'No', NA, 'Yes'),
  value_b = c('No', 'Yes', NA, NA, NA, NA)
)
cols <- c("value_a", "value_b")

,其计算结果为

代码语言:javascript
复制
   id time value_a value_b
1:  1    1    <NA>      No
2:  1    2     Yes     Yes
3:  1    3    <NA>    <NA>
4:  2    2      No    <NA>
5:  2    3    <NA>    <NA>
6:  2    4     Yes    <NA>

对于每个idtime,我希望扩展最新的观察值(<NA>对应于无观察值)。也就是说,我正在寻找一种有效的方法来创建结果表:

代码语言:javascript
复制
   id time value_a value_b
1:  1    1    <NA>      No
2:  1    2     Yes     Yes
3:  1    3     Yes     Yes
4:  2    2      No    <NA>
5:  2    3      No    <NA>
6:  2    4     Yes    <NA>

我的数据集非常大,所以效率很重要。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-06-04 23:19:29

这应该会更快。

使用zoo包中的na.locf (forward filling ),您可以执行以下操作:

代码语言:javascript
复制
dtable[, c('value_a','value_b') := lapply(.SD, na.locf, na.rm=F), .SDcols = c('value_a','value_b'), .(id)]

print(dtable)

   id time value_a value_b
1:  1    1      NA      No
2:  1    2     Yes     Yes
3:  1    3     Yes     Yes
4:  2    2      No      NA
5:  2    3      No      NA
6:  2    4     Yes      NA
票数 2
EN

Stack Overflow用户

发布于 2018-06-04 19:19:47

受@chinsoon12的启发,我想出了以下解决方案

代码语言:javascript
复制
cols <- c("value_a", "value_b")
dtable[, (cols) := lapply(.SD, function(x) {
  if (.N > 1) {
    na_idx = which(is.na(x))
    value_idx = which(!is.na(x))

    # determine if there are any non NA values
    if (length(value_idx) > 0){

      # update all NAs observed after an actual observed observation
      if (length(na_idx[na_idx > min(value_idx)]) > 0)
        na_idx[na_idx > min(value_idx)] <- sapply(na_idx[na_idx > min(value_idx)], function(i) max(value_idx[value_idx < i]))

      # build new index array to use for return
      replace_with_idx <- c(na_idx, value_idx)
      return(x[replace_with_idx[order(replace_with_idx)]])
    } else {
      NA  # if all NA
    }
  }
  x  # if only one observed value
}), 
by=id, .SDcols=cols]
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50676684

复制
相关文章

相似问题

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