如何为查找/返回大于或小于搜索值的第一个值的日期和时间编写索引/匹配函数



我有一个简单的excel数组函数,我很难在R.中使用它

excel函数是一个INDEX/MACH函数,用于返回第一个日期和时间点大于(或小于(的相关环境变量记录物种丰度的日期和时间。

这是excel公式:

{=INDEX('the environmental variable range i.e. temperature',
MATCH('date'+'time',from the'date range'+'time range',1))}
1 specifies less than and requires the data to be sorted smallest to 
largest while -1 specifies greater than and requires the data to be sorted 
largest to smallest.

我想知道如何在R中重现这一点?

我已经加载了丰度数据(data(和环境数据(EnVar(,并使用as.POSIXct 将每个数据中的DataTime列转换为日期-时间格式

data$DateTime <- as.POSIXct(data$DateTime,format="%d/%m/%Y %H:%M")

然后我用xts包订购了它们:

d <- xts(data, order.by = data$DateTime)
v <- xts(EnVar, order.by = EnVar$DateTime)

在将正确的行放入循环函数之前,我一直在尝试找出如何对其进行索引。

我开始尝试使用匹配功能:

d$DateTime[1] %in% v$DateTime

问题是,从d开始的日期和时间与t中的不完全相同,我不知道如何在匹配函数中添加大于或小于函数。

然后我找到了which和which.min/max函数:

min(which(v$DateTime > d$DateTime[1]))

这会返回一个错误"no nonmissing arguments to min;return Inf",但是,如果我用d$DateTime[1]的值替换d$DateTime[1],它会起作用:

min(which(v$DateTime > "2015-12-04 10:00:00"))

并返回正确的索引位置(在这种情况下为14(。虽然我不知道为什么?

我也试过:

Position(v$DateTime > d$DateTime[1],t)

但这会返回一个错误。

我还研究了dplyr包和left_join函数,但这(来自我的测试(只有在数据文件中的日期和时间匹配时才有效(而事实并非如此(。

最后我试了一下:

subset(v,which(abs(d$DateTime[i]-v$DateTime[i])==min(abs(d$DateTime[i]- 
v$DateTime[i]))))$temperature

但只有当两个文件的长度相同时(事实并非如此(,这才有效。

任何解决方案、建议和帮助都将不胜感激。

谢谢。

我设法找到了问题的解决方案!

这绝对不是一个很好的解决方案,但它很有效,并为我提供了所需的输出。我想我会分享我的发现,以防有人想办法做到这一点。然而,我相信还有更好的方法可以做到这一点,我只是还没有想出任何方法。

加载数据和环境变量(var,例如tempvar(,并将DateTime列(Dtime(作为字符。

然后使用as.POSIXct将其转换为正确的格式,例如:

data$DTime <- as.POSIXct(data$DTime,format="%d/%m/%Y %H:%M")

然后按日期订购:

d <- xts(data, order.by = data$DTime)
v <- xts(tempvar, order.by = tempvar$DTime)

创建每个日期列的矢量:

var <- as.vector(v$Dtime)
data <- as.vector(d$Dtime)

然后创建这个管道函数:

"%GT%" <- function(x, y) min(which(x > y))

索引最小值,其中x>y

创建一个空白向量,然后用这个来填充for循环和我们刚刚制作的管道函数:

FirstValueGreaterThan <- as.vector(mode="integer",0)
for (i in 1:length(data)) {
FirstValueGreaterThan[i] <- var %GT% data[i]
}

最后,按行号创建一个新的数据帧子设置(存储在FirstValueGreaterThan中(

variable.eg.temp.greaterThan <- tempvar[FirstValueGreaterThan,]

如果您希望第一个值小于,只需从FirstValueGreaterThan:中减去1行

variable.eg.temp.greaterThan <- tempvar[FirstValueGreaterThan-1,]

然后这些可以像往常一样修改到你的主数据框上:

data$newdata <- variable.eg.temp.greaterThan$temp or Dtime...

相关内容

最新更新