Извлечение данных из одного фрейма данных в другой в r

#r #finance

#r #финансы

Вопрос:

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

В дополнение к датам (форматируется как «%Y-%m-%d») У меня есть столбец со счетчиком для каждого торгового дня за месяц. Пример данных выглядит следующим образом:

     df$date <- as.Date(c("2017-03-25","2017-03-26","2017-03-27","2017-03-29","2017-03-30",
                         "2017-03-31","2017-04-03","2017-04-04","2017-04-05","2017-04-06",
                         "2017-04-07","2017-04-08","2017-04-09"))

    df$DayofMonth <- c(18,19,20,21,22,23,1,2,3,4,5,6,7)
    
    df$price <- (100, 100.53, 101.3 ,100.94, 101.42, 101.40, 101.85, 102, 101.9, 102, 102.31, 102.1, 102.23)
  

И теперь я хочу извлечь последние 3 наблюдения в марте и первые 5 наблюдений в апреле (а затем последние 3 наблюдения в апреле и первые 5 в мае и т. Д., Включая все столбцы соответствующих строк) и сохранить их в новом фрейме данных. Вопрос только в том, как мне это сделать?

Спасибо за помощь!

Ответ №1:

Первая идея:

 date <- c("2017-03-25","2017-03-26","2017-03-27","2017-03-29","2017-03-30",
                 "2017-03-31","2017-04-03","2017-04-04","2017-04-05","2017-04-06",
                 "2017-04-07","2017-04-08","2017-04-09")

df <- data.table(Date = date)

df[,YearMonth:=str_sub(Date,1,7)]
df[, DayofMonth := seq(.N), by = YearMonth]

first <- df[, .SD[1:ifelse(.N < 5, .N, 5)], by = YearMonth] #first trading days each month
last <- df[, .SD[(ifelse((.N-2) < 0, 0, (.N-2))):.N], by = YearMonth] #last trading days each month

final <- rbind(first, last)
setorder(final, Date)

# be aware that it leads to duplicates for a month if it has less than 8 trading days, 
# to resolve that use unique()

final <- unique(final)
  

Комментарии:

1. Как вы можете видеть, он содержит код вашего первого вопроса. Я надеюсь, что это поможет 🙂

2. Еще раз большое спасибо @peter! Действительно полезно 🙂 Я опубликовал еще один вопрос о том, как я могу использовать df$DayofMonth для создания фиктивной переменной в исходном фрейме данных (df) со значением 1 для для последних 3 и первых 5 наблюдений следующего месяца и 0 в противном случае, если вы хотите взглянуть!

Ответ №2:

быстро и грязно: добавьте столбец, аналогичный столбцу DayOfMonth, но сдвинутый на 3 вниз

 df$dom2 <- df$DayofMonth[4:(nrow(df) 3)]
subset(df, DayofMonth<=5 | dom2<=3)
  

единственная причина, по которой мы все еще фильтруем с помощью фактического столбца DayOfMonth (вместо того, чтобы просто указывать dom2<=8), заключается в том, что в конце dom2 для вашего примера будет NA . Не знаю, как выглядят ваши реальные данные, но лучше перестраховаться, чем потом сожалеть.