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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了R - 使用不同数据框架中的日期,检查日期范围是否包含某个值。相关的知识,希望对你有一定的参考价值。

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

我有两个数据框架: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
答案

替换 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     
另一答案

我们可以用

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

以上是关于R - 使用不同数据框架中的日期,检查日期范围是否包含某个值。的主要内容,如果未能解决你的问题,请参考以下文章

检查日期是不是在 sql 中的日期范围之间(不检查年份)

MySQL 检查日期范围是不是在日期范围内

在 Javascript 中使用夏令时检查日期范围

Java:检查当前日期是不是在特定日期范围内[重复]

检查一个表中的日期是不是出现在 Access 中另一个表的范围内

应用引擎数据存储中的可用性日期范围查询?