【问题标题】:Nearest non-NA value最近的非 NA 值
【发布时间】:2023-04-09 22:39:01
【问题描述】:

我有一个数据框test

> 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")

【问题讨论】:

  • 您能否在您的dput 中加入timestamp 列?
  • 是的,我已经这样做了——编辑
  • 后续元素是否使用相同的前/后?
  • @akrun 是一样的
  • 既然你提到'基于时间戳':数据集是否应该在确定下一个/上一个元素之前排序。因为如果是这种情况,我会得到不同的结果

标签: r dplyr data.table zoo


【解决方案1】:

我将使用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>

【讨论】:

  • 如果我订购data.frame,我会在这里得到不同的结果:两个索引的帖子都等于“a”。
  • 不在您提供的样本中。也许您可以更新它和/或使用您拥有的任何产生与这些不同的结果的代码?
  • 我没有提供任何样品。您的代码在这里不起作用,因为它不会按时间戳排序 test[order(timestamp),] 应该是 test[order(test$timestamp),],否则它会抛出错误并且在执行其余部分之前不对 df 进行排序 // PS:这实际上不是您的问题代码(除了排序问题),我认为 OP 所需的输出不适合有序的 df。
猜你喜欢
  • 2014-06-13
  • 2015-02-18
  • 1970-01-01
  • 1970-01-01
  • 2011-12-05
相关资源
最近更新 更多