r - 最接近的非 NA 值

标签 r dplyr data.table zoo

我有一个数据框测试

> test
   foo  bar  baz  timestamp
1    1 <NA>    a 1552157998
2    1 <NA> <NA> 1552161596
3    1 stop <NA> 1552165194
4    1 <NA>    b 1552168795
5    1 <NA>    a 1552170839
6    1 <NA> <NA> 1552157998
7    1 stop <NA> 1552161596
8    1 <NA>    a 1552165194
9    1 <NA>    b 1552168795
10   1 <NA> <NA> 1552170839

我的目标是为每个 stop 实例找到每个方向上最接近的非 NA 值(基于 timestamp),这将生成一个表格,例如像这样:

> output
  rownum pre post
1      3   a    b
2      7   a    a

是否有已知的方法可以使用 zoona.locf() 执行此操作?

如有任何建议,我们将不胜感激

dput(test)
structure(list(foo = c(1, 1, 1, 1, 1, 1, 1, 1, 1, 1), bar = c(NA, 
NA, "stop", NA, NA, NA, "stop", NA, NA, NA), baz = c("a", NA, 
NA, "b", "a", NA, NA, "a", "b", NA), timestamp = c(1552157998.427, 
1552161596.004, 1552165194.255, 1552168794.918, 1552170839.363, 
1552157998.427, 1552161596.004, 1552165194.255, 1552168794.918, 
1552170839.363)), row.names = c(NA, -10L), class = "data.frame")

最佳答案

我将仅使用 magrittr 来组织代码。这可以轻松地转换为非 magrittrdplyrdata.table,只需付出最少的努力。

library(magrittr)
test %>%
  .[ order(.$timestamp), ] %>%
  transform(.,
            rownum = seq_len(nrow(.)),
            pre = zoo::na.locf0(baz),
            post = zoo::na.locf0(baz, fromLast = TRUE)) %>%
  subset(., bar == "stop") %>%
  .[, c("rownum", "pre", "post")]
#   rownum pre post
# 7      4   a    a
# 3      5   a    a

(这与预期的输出不同,可能是因为这是一个错误?)

通过在 subset 之前查看它,您可以更好地了解它的作用:

test %>%
  .[ order(.$timestamp), ] %>%
  transform(.,
            rownum = seq_len(nrow(.)),
            pre = zoo::na.locf0(baz),
            post = zoo::na.locf0(baz, fromLast = TRUE))
#    foo  bar  baz  timestamp rownum pre post
# 1    1 <NA>    a 1552157998      1   a    a
# 6    1 <NA> <NA> 1552157998      2   a    a
# 2    1 <NA> <NA> 1552161596      3   a    a
# 7    1 stop <NA> 1552161596      4   a    a
# 3    1 stop <NA> 1552165194      5   a    a
# 8    1 <NA>    a 1552165194      6   a    a
# 4    1 <NA>    b 1552168795      7   b    b
# 9    1 <NA>    b 1552168795      8   b    b
# 5    1 <NA>    a 1552170839      9   a    a
# 10   1 <NA> <NA> 1552170839     10   a <NA>

关于r - 最接近的非 NA 值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55715554/

相关文章:

c++ - 如何使用 R 和 Rcpp 删除 NumericVector 中的元素以进行递归

R:计算唯一条目的累积数量

r - 使用 data.table 同时排序、行过滤和列选择

R data.table 文本解析

r - 包 "officer"中的 body_replace_all_text() 方法不起作用

r - 在自定义函数中对 data.cube 进行子集化

r - Rcpp 中二项式似然的快速评估

r - 合并/加入优先考虑非缺失值

r - 将一组中的一个值提取到新列

对巨大数据集进行重复连接