在R中使用between函数

e3bfsja2  于 2023-04-18  发布在  其他
关注(0)|答案(2)|浏览(202)

我有一个数据框,开始和结束日期在。我试图工作,如果我的日期落在哪一行。例如,我的数据框是这样的;

country startDate    endDate      weather
CHI     2022-12-29   2023-01-08    Rain
ENG     2023-01-01   2023-01-08    Cloud
GER     2023-01-02   2023-01-08    Cloud
FRA     2023-01-30   2023-02-05    Dry

我现在想创建一个指标,这样我就可以看到我的日期集是指哪个国家。

datestodo
2023-02-03
2023-02-04

因此,我需要我试图写的东西来返回FRA的行。我试图用between参数来做这件事,但我认为我很挣扎/可能不起作用,因为开始和结束没有联系,因为它们在不同的列中
我的尝试

activedates = between(datestodo, mydf$startDate, mydf$endDate)

不一定要使用between函数来完成,这也很好或类似

cyej8jka

cyej8jka1#

我们可以使用which()来标识落在startDateendDate列之间的给定日期的行索引。
我们用mydf[which...,]来划分行的子集。
碱基R:

datestodo <- as.Date(c("2023-02-03", "2023-02-04"))

mydf[which(datestodo >= mydf$startDate & datestodo <= mydf$endDate), ]
country  startDate    endDate weather
4     FRA 2023-01-30 2023-02-05     Dry
k5ifujac

k5ifujac2#

TarJoe提供了一个基本的R解决方案。下面是为什么dplyr不能工作-以及使其工作的方法。
当你运行你的代码时,错误会告诉你什么是错误的。我们已经注意到错误消息对tidyverse包中的函数有用。

between(datestodo, mydf$startDate, mydf$endDate)

Error in `between()`:
! Can't recycle `left` (size 4) to size 2.

这个错误说你提供给left参数的内容太长了(长度为4而不是2)。
如果我们阅读between()的帮助文件,我们会发现发生了什么。between()的用法是:

between(x, left, right)

其中x是值的向量,leftright是边界值。输入leftright需要可循环到x的长度,因此它们需要与x相同的长度或整数除数。您的x的长度为2,因此leftright可以分别有两个值,也可以有一个重复使用的值。该函数不能将四个边界值Map到两个比较值。
你想做的是将每一行中的开始和结束日期datestodo中的两个值进行比较,并只返回那些匹配的值。下面是如何使用between()函数以dplyr的方式完成这一任务的。

mydf %>%
  rowwise() %>% # tells dplyr to do one row at a time, otherwise you get the same error 
  filter(any(between(datestodo, startDate, endDate))) # between returns two logical values, 
     # but filter expects one per row. any() returns true if any value is true

相关问题