заполнить столбец с условной датой столбца в R - PullRequest
0 голосов
/ 01 июля 2019

Мне нужна помощь, чтобы добавить столбец в базу данных с информацией из другой таблицы.Итак, у меня есть .txt, как это (эта таблица содержит информацию о датах, когда меняется классификация компаний):

Table 1 имя этого .txt - CLASIF.txt

Затем мне нужно заполнить вторую таблицу (основную базу данных), где историческая классификация меняется в зависимости от даты из первой таблицы, например:

Table 2 имя основной базы данных - DATA.txt.

как я могу это сделать в R ???

1 Ответ

0 голосов
/ 01 июля 2019

Я думаю, что полный диапазон дат можно расширить с помощью полного объединения / слияния. Это предполагает, что все даты в первом месяце. Расширенный диапазон дат, скрещенных со всеми уникальными id s

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 так же, как легко, например, 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")
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...