Я работаю над проектом, анализирующим изменения тарифов компаний-эмитентов кредитных карт с течением времени и твиты от обычных компаний-эмитентов кредитных карт за тот же период времени. Цель состоит в том, чтобы посмотреть, сможем ли мы предсказать, когда компания, выпускающая кредитные карты, изменит свои ставки на основе своих учетных записей в Twitter.
У меня есть два фрейма данных: 1) изменилась ли процентная ставка в указанную дату [ЦЕНЫ] и 2) твиты и в какой день они были созданы [Твиты]. Для каждой даты в твитах я хочу отфильтровать набор данных RATES по существу с TWEETS $ DATE_CREATED - с 7 на TWEETS $ DATE_CREATED и посмотреть, не произошло ли изменение курса в наборе данных RATES в этом диапазоне дат.
Прямо сейчас Я использую для l oop, чтобы сделать это (тьфу, я знаю). Это невероятно медленно, и я уверен, что это способ сделать это для l oop в однострочном режиме, который работает быстрее. Любая помощь будет принята с благодарностью.
Этот параметр for-l oop фильтрует RATES по каждому из твитов $ create_date и предыдущих 7 дней и ищет 1 в столбце TWEETS $ changeToday, затем помещает его в новый столбец в твитах.
install.packages("lubridate") #dates modification package
library(lubridate)
rates.date <- mdy(c("01/01/20", "01/02/20", "01/03/20", "01/04/20"))
rate <- c(0.25, 0.25, 0.50, 0.50)
changedToday <- c(NA, 0, 1, 0)
RATES <- data.frame(rates.date, rate, changedToday) #mdy() converts string to date as month day year
tweets.date <- mdy(c("01/02/20", "01/10/20"))
text <- c("Tweet 1", "tweet 2")
TWEETS <- data.frame(tweets.date, text)
for (i in c(1:nrow(TWEETS))) {
TWEETS$changedInLast7[i] = any(filter(RATES, TWEETS$tweets.date[i] - days(7) < RATES$rates.date & RATES$rates.date <= TWEETS$tweets.date[i])$changedToday==1)
}
**RATES**
rates.date rate changedToday
1/1/20 0.25 NA
1/2/20 0.25 0
1/3/20 0.50 1 # 1 since it is different from yesterday
1/4/20 0.50 0
**TWEETS**
tweets.date text
1/2/20 "tweet 1"
1/10/20 "tweet 2"
**GOAL**
*TWEETS*
tweets.date text changeInLast7
1/2/20 "tweet 1" FALSE
1/10/20 "tweet 2" TRUE