Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/78.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R-检查字符串是否包含特定日期范围内的日期_R_Spotfire - Fatal编程技术网

R-检查字符串是否包含特定日期范围内的日期

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)),

我在R脚本中有以下要求(在Spotfire中编写表达式函数):


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