Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/74.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_Dplyr - Fatal编程技术网

R 多个日期范围上的条件联接

R 多个日期范围上的条件联接,r,dplyr,R,Dplyr,我有两个数据帧:“探测”和“事件”。下面的代码将生成这些数据帧的可复制样本。Probes.subset是来自与事件中的日期时间范围相交的探测器的所有观测值的数据帧。 下面的代码将生成6个事件…实际上,我有近200个谨慎的事件 Aim:我需要根据时间戳将Event.name from Events连接到Probes.subset中的每个对应观察,以便每个观察都与正确的事件关联 我知道,但这是难以置信的缓慢,并没有完成,因为我的数据超过180000行长。我有一种感觉,这可以通过编写一个函数和使用类似

我有两个数据帧:“探测”和“事件”。下面的代码将生成这些数据帧的可复制样本。Probes.subset是来自与事件中的日期时间范围相交的探测器的所有观测值的数据帧。 下面的代码将生成6个事件…实际上,我有近200个谨慎的事件

Aim:我需要根据时间戳将Event.name from Events连接到Probes.subset中的每个对应观察,以便每个观察都与正确的事件关联

我知道,但这是难以置信的缓慢,并没有完成,因为我的数据超过180000行长。我有一种感觉,这可以通过编写一个函数和使用类似apply的东西来解决,但我对R中的函数是一个完全的新手,我所创建的函数中没有一个是有效的

library(dplyr)

# Generate Probes data
start <- as.POSIXct("01/06/2016 01:00", format = "%d/%m/%Y %H:%M")
end <- start + as.difftime(1, units = "days")

Timestamp <- seq(from = start, to = end, by = "10 mins")
Value <- round(runif(145) * 100, 2)

Probes <- data.frame(Timestamp, Value)

# Generate Events data
Event.name <- seq(1, 6)

Event.start <- as.POSIXct(c("01/06/2016 01:20", "01/06/2016 05:00",
                            "01/06/2016 06:30", "01/06/2016 12:00",
                            "01/06/2016 17:40", "01/06/2016 19:20"),
                          format = "%d/%m/%Y %H:%M")

Event.end <- as.POSIXct(c("01/06/2016 02:00", "01/06/2016 05:30",
                            "01/06/2016 07:20", "01/06/2016 14:00",
                            "01/06/2016 18:10", "01/06/2016 21:40"),
                          format = "%d/%m/%Y %H:%M")

Events <- data.frame(Event.name, Event.start, Event.end)

# Subset probes data to fall within Events bounds
Probes.subset <- Probes %>%
  mutate(InRange = Timestamp %in% unlist(Map(
    `:`,
    Events$Event.start,
    Events$Event.end
  ))) %>%
  filter(InRange == "TRUE")
库(dplyr)
#生成探测数据

开始在SQL中,您可以在加入时使用
as
为不同的数据集指定别名。这允许您从每个数据集中选择特定的列。采用该答案的代码,您可以做到:

library(sqldf)
res <- sqldf("SELECT l.*, r.`Event.name`
       FROM Probes as l
       LEFT JOIN Events as r
       ON  l.Timestamp BETWEEN r.`Event.start` AND r.`Event.end`")

head(res)
#            Timestamp Value Event.name
#1 2016-06-01 01:00:00 60.73         NA
#2 2016-06-01 01:10:00 14.01         NA
#3 2016-06-01 01:20:00 17.14          1
#4 2016-06-01 01:30:00 43.64          1
#5 2016-06-01 01:40:00 27.05          1
#6 2016-06-01 01:50:00 57.10          1

在SQL中,您可以在加入时使用
as
为不同的数据集指定别名。这允许您从每个数据集中选择特定的列。采用该答案的代码,您可以做到:

library(sqldf)
res <- sqldf("SELECT l.*, r.`Event.name`
       FROM Probes as l
       LEFT JOIN Events as r
       ON  l.Timestamp BETWEEN r.`Event.start` AND r.`Event.end`")

head(res)
#            Timestamp Value Event.name
#1 2016-06-01 01:00:00 60.73         NA
#2 2016-06-01 01:10:00 14.01         NA
#3 2016-06-01 01:20:00 17.14          1
#4 2016-06-01 01:30:00 43.64          1
#5 2016-06-01 01:40:00 27.05          1
#6 2016-06-01 01:50:00 57.10          1

处理跨日期范围的连接,但它们的示例在数据帧之间有一个公共列。我不能对他们的问题发表评论,因为我的代表太低。这会产生你想要的结果吗
unlist(lappy)(probe.subset$Timestamp,function(x)其中(x>=Events$Event.start&x@Gopala)-我尝试运行它,但得到了以下错误:
错误在
$Yeah-对不起。使用
as.integer
,而不是
unlist
。它将正确地填充缺少的值。
as.integer(probe.subset$Timestamp,function(x)哪个(x>=Events$Event.start&x处理跨日期范围的连接,但它们的示例在数据帧之间有一个公共列。我无法对他们的问题进行评论,因为我的代表太低。这会产生您想要的结果吗?
unlist(lappy)(Probes.subset$Timestamp,function(x))其中(x>=Events$Event.start&x@Gopala-我尝试运行它,但得到以下错误:
$Yeah中的
错误-抱歉。请使用
as.integer
,而不是
unlist
。它将正确地填充缺少的值。
as.integer(lappy)(探测子集$Timestamp,函数(x),其中(x>=Events$Event.start&x啊,我在发布后找到了它。现在就尝试一下!效果非常好!非常感谢您的帮助,这已经让我头疼了好一阵子。我现在要在R中使用SQL了……还是个新手!+1没问题!我发现SQL对于这些类型的连接非常有用。如果您关心abo的话ut speed我编辑了一个fast
data.table
方法。虽然语法不是非常友好,但我正在尝试对您建议的两种方法进行速度测试,但是data.table方法一直在说unspeced']',我似乎无法修复这个该死的问题!您的第一个解决方案运行得非常快,尽管它在ove上运行r 180000行!是的,为了可读性,我编辑了最后一部分,我将对其进行更改,使其能够正常运行…很抱歉,我在发布后找到了它。现在尝试一下!效果非常好!非常感谢您的帮助,这已经让我头疼了很长一段时间。我现在将在r中使用SQL…仍然是个新手!+1没问题lem!我发现SQL非常适合这些类型的联接。另外,如果您关心速度,我编辑了一个快速的
data.table
方法。虽然语法不是非常友好,但我正在尝试对您建议的两种方法进行速度测试,但是data.table方法一直在说“非特定的”],我似乎无法修复这个该死的问题ng!您的第一个解决方案运行得非常快,尽管它可以处理180000多行!是的,为了可读性,我编辑了最后一部分,我将对其进行更改以使其正常运行…对此表示抱歉