R-检查字符串是否包含特定日期范围内的日期
我在R脚本中有以下要求(在Spotfire中编写表达式函数):R-检查字符串是否包含特定日期范围内的日期,r,spotfire,R,Spotfire,我在R脚本中有以下要求(在Spotfire中编写表达式函数): dateString在转换为“Date”类后,您可以从dplyr/data.table中使用方便的函数between。“dateString”是单个字符串,我们可以使用strsplit或仅使用scan在空白处拆分它 library(lubridate) library(data.table) between(mdy(scan(text=dateString, what='', quiet=TRUE)),
dateString在转换为“Date”类后,您可以从dplyr/data.table
中使用方便的函数between
。“dateString”是单个字符串,我们可以使用strsplit
或仅使用scan
在空白处拆分它
library(lubridate)
library(data.table)
between(mdy(scan(text=dateString, what='', quiet=TRUE)),
mdy(startDate), mdy(endDate))
为了便于理解,可以将上述单行拆分为不同的步骤
#split the string to substring at whitespace.
v1 <- scan(text=dateString, what='', quiet=TRUE)
#convert to Date class
v2 <- mdy(v1)
#use between to get a logical index of the dates
#that are between 'startDate' and 'endDate'
res <- between(v2, mdy(startDate), mdy(endDate))
res
#[1] TRUE FALSE TRUE FALSE
或数字索引以替换“res”中的值
c('No', 'Yes')[res+1L]
#[1] "Yes" "No" "Yes" "No"
上面的步骤可能有点混乱。但是,每当我发现一些不太明显的东西时,我就会将代码分割成尽可能小的代码。在这里,我会寻找
res+1L
#[1] 2 1 2 1
添加/乘以逻辑索引会将逻辑索引强制为二进制整数,即0/1。这里我们添加了1L
或整数1。所发生的情况是,强制为1的真值将与1L相加以获得2,强制为0的假值将与1相加并0+1=1
当逻辑索引转换为数字索引时,我们使用它来替换字符串向量c('No','Yes')
。请注意,字符串的第一个位置为“否”,第二个位置为“是”。根据数值索引的长度,即“4”和该索引指定的位置索引,我们将该索引替换为“是/否”
我们也可以在不使用任何外部包的情况下实现这一点
v2 <- as.Date(v1, '%m/%d/%Y')
v2 >= as.Date(startDate, '%m/%d/%Y') & v2 <= as.Date(endDate, '%m/%d/%Y')
#[1] TRUE FALSE TRUE FALSE
v2=as.Date(startDate,%m/%d/%Y')&v2这里有一个没有附加包的替代解决方案
首先,将字符串表示为日期:
dates <- lapply(strsplit(dateString, " +")[[1L]], as.Date, "%m/%d/%Y")
start <- as.Date(startDate, "%m/%d/%Y")
end <- as.Date(endDate, "%m/%d/%Y")
日期感谢您的快速回复。不幸的是,lubridate包不可用于在Spotfire中编写脚本。还有其他方法解决这个问题吗?@ashetty I还更新了base R函数。请检查这是否有效。如果我需要将输出进一步简化为上述结果向量的AND运算,该怎么办?例:[真,假]为假或[真,真]为假TRUE@ashetty使用all
即all(c(TRUE,FALSE))
和类似的all(c(TRUE,TRUE))
v2 <- as.Date(v1, '%m/%d/%Y')
v2 >= as.Date(startDate, '%m/%d/%Y') & v2 <= as.Date(endDate, '%m/%d/%Y')
#[1] TRUE FALSE TRUE FALSE
dates <- lapply(strsplit(dateString, " +")[[1L]], as.Date, "%m/%d/%Y")
start <- as.Date(startDate, "%m/%d/%Y")
end <- as.Date(endDate, "%m/%d/%Y")
sapply(dates, function(x) x >= start && x <= end)
# [1] TRUE FALSE TRUE FALSE