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