【问题标题】:Adding Rows After Missing Sequence [duplicate]在缺少序列后添加行[重复]
【发布时间】:2020-11-05 01:05:44
【问题描述】:

我有一个长格式时间序列数据的数据框 (df),它具有可变 ID 和日期和金额。

id  day amount
1   41  15.29
1   42  15.29
1   43  15.29
1   44  15.29
1   45  15.3
1   46  15.3
1   47  15.3
1   48  15.31
1   49  15.31
1   50  15.31
1   52  15.32
1   53  15.32
1   54  15.32
1   55  15.32
1   58  15.33
1   59  15.34
1   60  15.34
1   61  15.34

请注意,第 51 天不见了。我想要做的是找到丢失的值,然后添加行,然后重新编号,然后对整个 df 重复。

所以它最终会是这样的:

1   41  15.29
1   42  15.29
1   43  15.29
1   44  15.29
1   45  15.3
1   46  15.3
1   47  15.3
1   48  15.31
1   49  15.31
1   50  15.31
-99 51  -99
1   52  15.32
1   53  15.32
1   54  15.32
1   55  15.32
1   58  15.33
1   59  15.34
1   60  15.34
1   61  15.34

【问题讨论】:

  • 对于ID = 2,为什么预期输出中有2个-99?只缺少一个(天 = 2)。

标签: r


【解决方案1】:

您可以使用complete 来填补缺失的日子。

library(dplyr)
library(tidyr)

df1 <- df %>%
        mutate(DAY1 = DAY) %>%
        complete(ID, DAY, fill = list(DAY1 = -99)) %>%
        select(ID, DAY = DAY1)
df1
#      ID   DAY
#   <int> <dbl>
# 1     1     1
# 2     1     2
# 3     1     3
# 4     1     4
# 5     2     1
# 6     2   -99
# 7     2     3
# 8     2     4
# 9     3     1
#10     3   -99
#11     3     3
#12     3   -99

对于更新的数据,我们可以尝试按组添加day:

df1 <- df %>%
        group_by(id) %>%
        complete(day = min(day):max(day), fill = list(amount = -99)) 
df1

数据

df <- structure(list(ID = c(1L, 1L, 1L, 1L, 2L, 2L, 2L, 3L, 3L), DAY = c(1L, 
2L, 3L, 4L, 1L, 3L, 4L, 1L, 3L)), class = "data.frame", row.names = c(NA, -9L))

【讨论】:

  • 谢谢罗纳克。我无法让它工作,所以我更新了这个例子。有什么想法吗?
  • @ScottColwell 那么我的回答中缺少什么? ID 和 amount 列应该 -99 ?
  • 我不确定,但它没有添加行
  • 您是否将输出分配回新对象?我还添加了另一个选项。你能检查一下吗?
  • 明白了!非常感谢你的帮助。有 47,000 行,我害怕手动查看。
猜你喜欢
  • 2021-11-30
  • 1970-01-01
  • 2021-10-20
  • 1970-01-01
  • 2017-11-09
  • 2020-05-16
  • 1970-01-01
  • 2017-05-16
  • 2020-05-07
相关资源
最近更新 更多