用R中的条件日期列填充一列

时间:2019-07-01 15:01:47

标签: r

我需要帮助,以在数据库中添加包含来自其他表的信息的列。 因此,我有一个像这样的.txt(此表包含更改公司分类的日期信息):

Table 1 该.txt的名称为CLASIF.txt

然后,我需要完成第二个表(主体数据库),其中历史分类根据第一个表中的日期而变化,如下所示:

Table 2 主要数据库的名称为DATA.txt

我如何在R中做到这一点?

1 个答案:

答案 0 :(得分:0)

我认为可以通过完全加入/合并来扩展整个日期范围。假设所有日期都在该月的第一天。日期的扩展范围与所有唯一的id交叉

daterange <- expand.grid(
  id = unique(x$id),
  date = seq.Date(min(x$date), max(x$date) + 31, by = "month"),
  stringsAsFactors = FALSE
)

有两种实现方式,具体取决于您的风格:

library(dplyr)
library(tidyr)
x %>%
  full_join(daterange, by = c("id", "date")) %>%
  arrange(id, date) %>%
  group_by(id) %>%
  mutate(clasif = zoo::na.locf(clasif)) %>%
  ungroup()
# # A tibble: 8 x 3
#   id    date       clasif
#   <chr> <date>     <chr> 
# 1 A     2018-01-01 A     
# 2 A     2018-02-01 A     
# 3 A     2018-03-01 AAA   
# 4 A     2018-04-01 AAA   
# 5 B     2018-01-01 BBB   
# 6 B     2018-02-01 BBB   
# 7 B     2018-03-01 BBB   
# 8 B     2018-04-01 BBB   

library(data.table)
library(magrittr)
xDT <- copy(x)
setDT(xDT)
xDT <- merge(xDT, daterange, by = c("id", "date"), all = TRUE) %>%
  .[ order(id, date), ] %>%
  .[, clasif := zoo::na.locf(clasif), by = "id"]

(我在这里使用magrittr来将data.table流分成一个逐步的管道,主要是为了视觉上的好处。这不是必需的;这取决于您的喜好,可以通过DT管道传输-wise同样容易,例如xDT[...][...][...]。)

这两个操作的前提是进行合并后,我们在clasif列中会出现“漏洞”:

x %>%
  full_join(daterange, by = c("id", "date"))
#   id       date clasif
# 1  A 2018-01-01      A
# 2  A 2018-03-01    AAA
# 3  B 2018-01-01    BBB
# 4  A 2018-02-01   <NA>
# 5  B 2018-02-01   <NA>
# 6  B 2018-03-01   <NA>
# 7  A 2018-04-01   <NA>
# 8  B 2018-04-01   <NA>

从这里开始,zoo::na.locf(按id,按date排序)填充孔。


数据:

x <- data.frame(
  id = c("A", "A", "B"),
  date = c("01/01/2018", "03/01/2018", "01/01/2018"),
  clasif = c("A", "AAA", "BBB"),
  stringsAsFactors = FALSE
)
x$date <- as.Date(x$date, format = "%m/%d/%Y")