Возьмите различия из одного кадра данных на основе дат из другого кадра данных - PullRequest
0 голосов
/ 02 июня 2018

Набор данных A

Name  Date    Value  change  year NewColumn
A     2000-02   0.5  NA      2000        NA
A     2001-03   0.4  -0.200  2001         0
A     2002-02   1     1.5    2002         1
A     2003-05   0.9  -0.100  2003         0
A     2004-06   0.9   0      2004        NA
A     2006-03   0.4  -0.556  2006        NA

Итак, я хочу посмотреть на дату столбца, если есть (0/1) в моем столбце NewColumn, а затем посмотреть на даты этого года и предыдущего годаиз моего набора данных A и возьмите из этого значения из тех же дат, но месяцем ранее из набора данных B, и возьмите разницу в моем новом наборе данных.

Есть ли способ легко кодировать это?

Если нет, то, наверное, мне придется сделать это вручную, используя Excel.Или есть менее трудоемкий способ или трюк, который я мог бы решить эту проблему:)

Спасибо:)

1 Ответ

0 голосов
/ 02 июня 2018

Поскольку предыдущий месяц включает в себя df_A с df_B, следовательно, было бы лучше подготовить df_A, добавив столбец с предыдущей датой, к которой он может быть присоединен с df_B.

Аналогично, при получении данных из df_B требуется вычитание ValueofInterest из предыдущей даты, поэтому было бы хорошо подготовить df_B, добавив столбец, хранящий ValueofInterest из предыдущей даты.

Поскольку дата упоминалась в year и month, поэтому я предпочел использовать функцию zoo.yearmon для преобразования даты.

Наконец, мы можем объединить df_A и df_B, чтобы получить результат в виде:

library(zoo)
library(dplyr)

# First prepaer df_A to join
df_A %>% mutate(Date = as.yearmon(Date, "%Y-%m")) %>%
  arrange(Date) %>%
  mutate(DateToJoin = Date - (1/12)) %>% # The previous month for joining
  left_join(df_B %>% mutate(DateToJoin = as.yearmon(paste0(year, month),"%Y%m")) %>%
        arrange(DateToJoin) %>%
        mutate(valueToDeduct = lag(ValueofInterest)),
  by = "DateToJoin") %>%
  mutate(Difference = ifelse(is.na(NewColumn), NA , ValueofInterest-valueToDeduct)) %>%
  select(Name, Date, Value, change, year= year.x, NewColumn, Difference)

#   Name     Date Value change year NewColumn Difference
# 1    A Feb 2000   0.5     NA 2000        NA         NA
# 2    A Mar 2001   0.4 -0.200 2001         0       0.01
# 3    A Feb 2002   1.0  1.500 2002         1      -0.07
# 4    A May 2003   0.9 -0.100 2003         0       0.10
# 5    A Jun 2004   0.9  0.000 2004        NA         NA
# 6    A Mar 2006   0.4 -0.556 2006        NA         NA

Данные:

df_A <- read.table(text = 
"Name  Date    Value  change  year NewColumn
A     2000-02   0.5  NA      2000        NA
A     2001-03   0.4  -0.200  2001         0
A     2002-02   1     1.5    2002         1
A     2003-05   0.9  -0.100  2003         0
A     2004-06   0.9   0      2004        NA
A     2006-03   0.4  -0.556  2006        NA",
header=TRUE, stringsAsFactors = FALSE)


df_B <- read.table(text = 
"year      month   ValueofInterest    
1999        12       0.05
2000        1        0.19          
2000        2        0.12   
2000        3        0.07
2000        4        0.11   
2000        5        0.12
2000        6        0.12
2001        1       0.05
2001        2       0.06
2001        3       0.08
2002        1       0.01
2002        2       0.07
2002        3       0.05
2003        1       0.00
2003        2       0.03
2003        3       0.15
2003        4       0.25
2003        5       0.64
2008        11       0.15
2008        12       0.03",
header = TRUE, stringsAsFactors = FALSE)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...