我需要帮助,以在数据库中添加包含来自其他表的信息的列。 因此,我有一个像这样的.txt(此表包含更改公司分类的日期信息):
该.txt的名称为CLASIF.txt
然后,我需要完成第二个表(主体数据库),其中历史分类根据第一个表中的日期而变化,如下所示:
主要数据库的名称为DATA.txt
我如何在R中做到这一点?
答案 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")