Создание новых переменных путем подстановки данных - PullRequest
0 голосов
/ 23 июня 2018

Я хочу создать новые переменные, которые содержат информацию о каждом отдельном событии в течение недели: 3 дня до события и 3 дня после. Что у меня есть:

df <- Date   APP  DE10 
  2014-09-22 0    1.010 
  2014-09-19 0    1.043
  2014-09-18 0    1.081
  2014-09-17 0    1.050
  2014-09-16 0    1.061
  2014-09-15 0    1.067
  2014-09-12 1    1.082
  2014-09-11 0    1.041
  2014-09-10 0    1.047
  2014-09-09 0    0.996
  2014-09-08 0    0.953
  2014-09-05 0    0.928
  2014-09-04 1    0.970
  2014-09-03 0    0.955
  2014-09-02 0    0.931
  2014-09-01 0    0.882

Как я хочу, чтобы мой набор данных выглядел:

 APP      Indicator  DE10_Event1 DE10_Event2
 0        1          1.050      0.996
 0        2          1.061      0.996
 0        3          1.067      0.996
 1        4          1.082      0.970
 0        5          1.041      0.955
 0        6          1.047      0.931
 0        7          0.996      0.882

Я пробовал разные вещи, но это не сработало.

Редактировать

Набор данных, который я хочу, выглядит как приведенный выше. Мне это нужно для того, чтобы построить несколько линий на рисунке, чтобы сравнить рыночные эффекты за три дня до и после события. Короче говоря, мне нужна фигура, подобная приведенной ниже, но с большим количеством строк, каждая из которых представляет развитие до и после события. APP=1 указывает, когда происходит событие, поэтому мне нужно Indicator=4, когда APP=1.

Надеюсь, этот пересмотр имеет смысл. В противном случае не стесняйтесь спрашивать меня снова. Я действительно ценю любую помощь.

enter image description here

Ответы [ 3 ]

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

Ваш вопрос все еще неясен, но если я правильно понял, вам нужно не создать новую переменную, а выбрать дни вокруг каждого вхождения APP. Я отправляю новый ответ, так как это другой вопрос.

Чтение данных вашего примера:

df <- read.table( text = c('
  Date   APP  DE10 
  2014-09-22 0    1.010 
  2014-09-19 0    1.043
  2014-09-18 0    1.081
  2014-09-17 0    1.050
  2014-09-16 0    1.061
  2014-09-15 0    1.067
  2014-09-12 1    1.082
  2014-09-11 0    1.041
  2014-09-10 0    1.047
  2014-09-09 0    0.996
  2014-09-08 0    0.953
  2014-09-05 0    0.928
  2014-09-04 1    0.970
  2014-09-03 0    0.955
  2014-09-02 0    0.931
  2014-09-01 0    0.882' ),
  header = TRUE )

Теперь определите, где у вас есть приложения, и соберите данные. Конечно, есть более элегантные способы сделать это, но это подойдет. Он создаст новый data.frame со всем необходимым для ваших графиков:

# Itentify the rows where APP is 1:
APProws <- as.numeric(rownames( df[ df[,'APP'] == 1, ] ))

# An empty data.frame to receive the data:
APP.df <- data.frame(
  Event = rep(NA, length(APProws)*7),
  Date = as.Date('2000-12-31'),
  DE10 = NA,
  Indicator = NA )

n <- 0
for( i in APProws ) {

  rows <- (n*7+1):(n*7+7)

  APP.df$Event[rows] <- paste('Event', n+1)
  APP.df$Date[rows] <- df$Date[(i-3):(i+3)]
  APP.df$DE10[rows] <- df$DE10[(i-3):(i+3)]
  APP.df$Indicator[n*7+4] <- '1'

  n <- n+1
}; rm(i, n, rows)

Теперь у вас есть все необходимое для вашего сюжета.

library(ggplot2)

ggplot(APP.df, aes(Date, DE10)) +
  geom_line() +
  geom_vline(
    data = subset(APP.df, Indicator == 1),
    aes(xintercept = as.numeric(Date)),
    color = 'red' ) +
  facet_grid( ~Event, scales = 'free_x')

enter image description here

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

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

Спасибо за ваш вклад!

Для тех, кто ищет решение аналогичной проблемы, я объединил ответы, в которые попал:

df$APProws <- 1:nrow(df) #Variable with row numbers
events_rows <- df %>% filter(APP==1) %>% select(APProws) #Indicator for row number for event, APP=1

Вычтите две переменные, чтобы получить расстояние строки от события:

diffs <- data.frame(df %>% 
    mutate(Event1_DE10=df$APProws-events_rows$APProws[1]) %>% 
    mutate(Event2_DE10=df$APProws-events_rows$APProws[2])) 

Постройте фигуру:

diffs %>% ggplot() + 
  geom_line(aes(x=Event1_DE10,y=DE10), color="blue") +
  geom_line(aes(x=Event2_DE10,y=DE10), color="red") + 
  geom_vline(xintercept=0, linetype="dashed")  +
  scale_x_continuous(limits=c(-3,3)) +
  scale_y_continuous(limits=c(0.3,0.7))

Вот результат:

Bond yield development

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

Чтение данных вашего примера:

df <- read.table( text = c('
  Date   APP  DE10 
  2014-09-22 0    1.010 
  2014-09-19 0    1.043
  2014-09-18 0    1.081
  2014-09-17 0    1.050
  2014-09-16 0    1.061
  2014-09-15 0    1.067
  2014-09-12 1    1.082
  2014-09-11 0    1.041
  2014-09-10 0    1.047
  2014-09-09 0    0.996
  2014-09-08 0    0.953
  2014-09-05 0    0.928
  2014-09-04 1    0.970
  2014-09-03 0    0.955
  2014-09-02 0    0.931
  2014-09-01 0    0.882' ),
  header = TRUE )

Добавление номера дня недели:

df$Weekday <- strftime(df$Date, '%u')

Теперь посчитайте количество событий на одно приложение и день недели, а затем распределите ваши данные.Вы можете попробовать использовать dplyr / tidyr.Я привык к data.table, поэтому:

library(data.table)

df <- as.data.table(df)

df[ , Event := paste0('DE10_Event', 1:.N) , by = .(APP, Weekday) ]

df.s <- dcast(df, APP + Weekday ~ Event, value.var = 'DE10')

> df.s
   APP Weekday DE10_Event1 DE10_Event2 DE10_Event3 DE10_Event4
1:   0       1       1.010       1.067       0.953       0.882
2:   0       2       1.061       0.996       0.931          NA
3:   0       3       1.050       1.047       0.955          NA
4:   0       4       1.081       1.041          NA          NA
5:   0       5       1.043       0.928          NA          NA
6:   1       4       0.970          NA          NA          NA
7:   1       5       1.082          NA          NA          NA
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...