R - 使用不同数据框架中的日期,检查日期范围是否包含某个值。

问题描述 投票:0回答:1

我正在做一个项目,分析信用卡公司的利率随时间的变化,以及同期常见信用卡公司的推特。目标是看我们是否能根据信用卡公司的推特账号来预测他们何时会改变利率。

我有两个数据框架:1)如果利率在某个日期发生了变化[rate];2)推文以及它们是哪一天创建的[tweet]。对于TWEETS中的每一个日期,我想在基本上TWEETS$DATE_CREATED - 7到TWEETS$DATE_CREATED上过滤RATES数据集,看看在这个日期范围内RATES数据集是否有利率变化。

现在,我正在使用for循环来做这件事(唉,我知道)。它的速度慢得令人难以置信,我确信这是一种在单行中进行for循环的方法,它执行得更快。任何帮助都是非常感激的。

这个for-loop将RATES过滤到TWEETS$created_date和之前7天的每一个日期,并在TWEETS$changedToday列中寻找1,然后将其放入Tweets的一个新列中。

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
r date for-loop twitter lubridate
1个回答
0
投票

替换 for 循环可以用 sapply :

TWEETS$changedInLast7 <- sapply(TWEETS$tweets.date, function(x)
                         any(with(RATES, (x - 7) <= rates.date & 
                         rates.date <= x & changedToday == 1), na.rm = TRUE))

A tidyverse 的方式是 。

library(dplyr)

tidyr::crossing(TWEETS, RATES) %>%
    group_by(tweets.date, text) %>%
    summarise(changeInLast7 = any(between(rates.date, first(tweets.date) - 7, 
                          first(tweets.date)) & changedToday == 1, na.rm = TRUE))


# tweets.date   text    changeInLast7
#  <date>      <fct>   <lgl>        
#1 2020-01-02  Tweet 1 FALSE        
#2 2020-01-10  tweet 2 TRUE     

0
投票

我们可以用

TWEETS$changedInLast7 <- unlist(lapply(TWEETS$tweets.date, function(x)
                     any(with(RATES, (x - 7) <= rates.date & 
                     rates.date <= x & changedToday == 1), na.rm = TRUE)))
© www.soinside.com 2019 - 2024. All rights reserved.