首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >是否有一种填补时间间隔的data.table方法?

是否有一种填补时间间隔的data.table方法?
EN

Stack Overflow用户
提问于 2021-10-28 04:32:41
回答 1查看 210关注 0票数 1

是否有一种优雅的方法来填写缺少的时间段,如timetk::pad_by_timetsibble::fill_gapsdata.table

数据可能如下所示

代码语言:javascript
复制
library(data.table)
data<-data.table(Date = c("2020-01-01","2020-01-01","2020-01-01","2020-02-01","2020-02-01","2020-03-01","2020-03-01","2020-03-01"),
             Card = c(1,2,3,1,3,1,2,3),
             A = rnorm(8)
)

在2020年-02-01暗含缺失了卡片2的观测结果。

tsibble包中,您可以执行以下操作

代码语言:javascript
复制
library(tsibble)
data <- data[, .(Date = yearmonth(ymd(Date)), 
               Card = as.character(Card),
              A= as.numeric(A))]
data<-as_tsibble(data, key = Card, index = Date)
data<-fill_gaps(data)

timetk包中,您可以执行以下操作

代码语言:javascript
复制
library(timetk)
data <- data[, .(Date = ymd(Date), 
             Card = as.character(Card),
             A= as.numeric(A))]
data<-data %>%
  group_by(Card) %>%
  pad_by_time(Date, .by = "month") %>%
  ungroup()
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-10-28 10:30:39

只有data.table

如果没有设置键,则

代码语言:javascript
复制
data2 <- data[CJ(Date, Card, unique = TRUE), on = .(Date, Card)]
data2
#          Date  Card           A
#        <char> <num>       <num>
# 1: 2020-01-01     1  1.37095845
# 2: 2020-01-01     2 -0.56469817
# 3: 2020-01-01     3  0.36312841
# 4: 2020-02-01     1  0.63286260
# 5: 2020-02-01     2          NA
# 6: 2020-02-01     3  0.40426832
# 7: 2020-03-01     1 -0.10612452
# 8: 2020-03-01     2  1.51152200
# 9: 2020-03-01     3 -0.09465904

(多亏了@sindri_baldur!)

如果设置了密钥,则可以使用@Frank的方法:

代码语言:javascript
复制
data2 <- data[ do.call(CJ, c(mget(key(data)), unique = TRUE)), ]

从这里开始,您可以按需要使用nafill,也许

代码语言:javascript
复制
data2[, A := nafill(A, type = "locf"), by = .(Card)]
#          Date  Card           A
#        <char> <num>       <num>
# 1: 2020-01-01     1  1.37095845
# 2: 2020-01-01     2 -0.56469817
# 3: 2020-01-01     3  0.36312841
# 4: 2020-02-01     1  0.63286260
# 5: 2020-02-01     2 -0.56469817
# 6: 2020-02-01     3  0.40426832
# 7: 2020-03-01     1 -0.10612452
# 8: 2020-03-01     2  1.51152200
# 9: 2020-03-01     3 -0.09465904

(如何填写是基于您对数据上下文的了解;它可能是by=.(Date),或者某种形式的估算。)

Update:上面对可能的组合进行了扩展,这些组合可能会超出特定Card的范围,在这种情况下人们可能会看到:

代码语言:javascript
复制
data <- data[-1,]
data[CJ(Date, Card, unique = TRUE), on = .(Date, Card)]
#          Date  Card           A
#        <char> <num>       <num>
# 1: 2020-01-01     1          NA
# 2: 2020-01-01     2 -0.42225588
# 3: 2020-01-01     3 -0.12235017
# 4: 2020-02-01     1  0.18819303
# 5: 2020-02-01     2          NA
# 6: 2020-02-01     3  0.11916096
# 7: 2020-03-01     1 -0.02509255
# 8: 2020-03-01     2  0.10807273
# 9: 2020-03-01     3 -0.48543524

我认为有两种方法:

  1. 执行上述代码,然后删除每个组中的前导(和尾随)NA

dataCJ(日期,卡,唯一=真),on =.(日期,卡片),.SD !is.na(A) !seq_len(.N) %,% c(1,.N),#卡片日期A# 1: 1 2020-02-01 0.18819303 # 2: 1 2020-03-01 -0.02509255 # 3: 2 2020-01-01 -0.42225588 # 4: 2 2020-02-01 NA # 5: 2 2020-03-01 0.10807273 # 6: 3 2020-01 -0.12235017 #73 2020-02-01 0.11916096 # 8: 3 2020-03-01 -0.48543524

  1. 完全不同的方法(假设Date-class,不是严格要求的):

data,Date := as.Date(Date) data[data,.(Date = do.call(seq,c(as.list(range(Date),by =“month”)),by =.(卡),on =.(日期),#日期卡A## 1: 2020-01-01 2 -0.42225588 # 2: 2020-02-01 2 NA # 3: 2020-03-01 2 0.10807273 # 4: 2020-01 3 -0.12235017 # 5: 2020-02-01 3 0.11916096 # 6: 2020-03-01 3 -0.48543524 # 7:0.18819303 # 8: 2020-03-01 1 -0.02509255

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69748340

复制
相关文章

相似问题

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