- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
编辑 2019 年 9 月 30 日:添加示例和修改代码以实现可重现性。
编辑 01.10.2019:更好的解释。
我正在合并交通系统的两个不同数据集。一个 (df1) 是火车应该在某个车站的时刻表,另一个 (df2) 是对经过这些车站的火车的观察。
由于无法完成某些时间表(火车坏了、需要取消服务、建筑工地等)是很常见的,因此观察数据集包含的条目少于时间表。
我的目标是从乘客的角度衡量已实现时刻表的延误情况。这意味着:如果乘客知道火车应该在什么时间离开车站,他看到的延迟对应于火车在确切的预定时间离开 (delay = 0) 或紧接的下一类火车 < strong>(延迟 = depart_observed - depart_scheduled)。
目标转化为以下任务:通过以下方式合并两个数据集:
-stop_id: 因为我需要匹配每个站点的观测值,所以这显然是第一个匹配条件。
-时间戳:对于每个计划时间戳,我应该找到即时的连续观察时间戳。
结果应显示所有可能的时间表(唯一,无重复)与最接近的后续观察(也唯一,无重复)相匹配。同样,我需要确保执行合并的方式,只有在时间表之后或同时发生的观察才与时间表的正确时间戳相匹配。考虑到两个数据集之间的大小差异,我期望观察列中有大量 NA,因为时间表无法与观察配对。
为简单起见,提供的示例仅包含我用于连接的两列:
stop_id(车站的 id)和 timestamp(列车应该或在车站观察的日期和时间)。
我使用的方法是在 R 中使用 Data.Table 的滚动连接。这很好用,除了这样一个事实,即每当我创建连接时,我都会不断得到一个数据集的副本,而且我可以'合并集中没有这些重复。
我使用的代码:
#DECLARING FUNCTIONS (Two functions according to df1[df2] and df2[df1])
merge_schedule_obs <- function(df1, df2) {
setDT(df1)
setDT(df2)
max_delay <- 3600 # 1-hour max delay for pairing schedule and occurrence
setkey(df1, stop_id, departure)[, departScheduled:=departure]
df3 <- df1[df2, roll = max_delay]
return(df3)
}
merge_schedule_obs2 <- function(df1, df2) {
setDT(df1)
setDT(df2)
max_delay <- 3600 # 1-hour max delay for pairing schedule and occurrence
setkey(df1, stop_id, departure)[, departObserved:=departure]
df3 <- df1[df2, roll = -max_delay]
return(df3)
}
#CREATING SOME SAMPLE DATA (The real dataset is significantly larger. But this example should cover the problem)
#Sample Schedule Data:
df1 <- distinct(data.table(stop_id = as.factor(c("70015","70009", "70003", "70019","70013", "70007", "70019", "70005", "70007", "70019", "70005")),
departure = as.POSIXct(c("2019-09-09 06:57:00","2019-09-09 06:57:00", "2019-09-09 06:57:00",
"2019-09-09 06:54:30","2019-09-09 06:54:00", "2019-09-09 06:55:00",
"2019-09-09 06:55:30","2019-09-09 06:55:00", "2019-09-09 06:55:10",
"2019-09-09 06:55:00", "2019-09-09 06:58:00"))))
Out:
stop_id departure
1: 70015 2019-09-09 06:57:00
2: 70009 2019-09-09 06:57:00
3: 70003 2019-09-09 06:57:00
4: 70019 2019-09-09 06:54:30
5: 70013 2019-09-09 06:54:00
6: 70007 2019-09-09 06:55:00
7: 70019 2019-09-09 06:55:30
8: 70005 2019-09-09 06:55:00
9: 70007 2019-09-09 06:55:10
10: 70019 2019-09-09 06:55:00
11: 70005 2019-09-09 06:58:00
#Sample Observations Data:
df2 <- distinct(data.table(stop_id = as.factor(c("70013","70009", "70015", "70005", "70005", "70007", "70019")),
departure = as.POSIXct(c("2019-09-09 06:57:10","2019-09-09 07:00:17", "2019-09-09 07:00:12", "2019-09-09 06:58:20", "2019-09-09 06:58:00",
"2019-09-09 06:57:30", "2019-09-09 06:57:35")))
)
Out:
stop_id departure
1: 70013 2019-09-09 06:57:10
2: 70009 2019-09-09 07:00:17
3: 70015 2019-09-09 07:00:12
4: 70005 2019-09-09 06:58:20
5: 70005 2019-09-09 06:58:00
6: 70007 2019-09-09 06:57:30
7: 70019 2019-09-09 06:57:35
#MERGING DATASETS: (Both directions are covered, and the problem shows in both)
merged_df <- distinct(na.omit(merge_schedule_obs(df1,df2)))
Out:
stop_id departure departScheduled
1: 70005 2019-09-09 06:58:00 2019-09-09 06:58:00
2: 70005 2019-09-09 06:58:20 2019-09-09 06:58:00
3: 70007 2019-09-09 06:57:30 2019-09-09 06:55:10
4: 70009 2019-09-09 07:00:17 2019-09-09 06:57:00
5: 70013 2019-09-09 06:57:10 2019-09-09 06:54:00
6: 70015 2019-09-09 07:00:12 2019-09-09 06:57:00
7: 70019 2019-09-09 06:57:35 2019-09-09 06:55:30
merged_df2 <- distinct(na.omit(merge_schedule_obs2(df2,df1)))
Out:
stop_id departure departObserved
1: 70005 2019-09-09 06:55:00 2019-09-09 06:58:00
2: 70005 2019-09-09 06:58:00 2019-09-09 06:58:00
3: 70007 2019-09-09 06:55:00 2019-09-09 06:57:30
4: 70007 2019-09-09 06:55:10 2019-09-09 06:57:30
5: 70009 2019-09-09 06:57:00 2019-09-09 07:00:17
6: 70013 2019-09-09 06:54:00 2019-09-09 06:57:10
7: 70015 2019-09-09 06:57:00 2019-09-09 07:00:12
8: 70019 2019-09-09 06:54:30 2019-09-09 06:57:35
9: 70019 2019-09-09 06:55:00 2019-09-09 06:57:35
10: 70019 2019-09-09 06:55:30 2019-09-09 06:57:35
运行与数据集 df1 和 df2 的滚动连接的结果在站 70005 中创建了一个重复的时间表条目(如果我以相反的方式运行连接 df1[df2, roll = max_delay, ...] 重复项相反,发生在观测站 70005 和 70019)。基本上,我无法摆脱它们。我尝试了 mult 的选项(第一个,最后一个)并尝试使用 rollends ......仍然总是不需要重复......
如何合并这些数据集而不产生任何重复?
谢谢!
最佳答案
首先,您可以使用 unique
而不是 distinct
(后者可能来自 dplyr
;您未指定)以避免将数据表强制转换为数据框。
你很接近,但是你需要在连接中切换表,即类似 df2[df1]
的东西,以便 df1
中的行用作搜索键,然后您可以使用 mult
删除重复项。
这是一种使用非等连接执行您想要的操作的方法:
setkey(df1, departure)
setkey(df2, departure)
df1[, max_departure := departure + as.difftime(1, units = "hours")
][, observed_departure := df2[df1,
x.departure,
on = .(stop_id, departure >= departure, departure <= max_departure),
mult = "first"]
][, max_departure := NULL]
我们按departure
(通过setkey
)排序,以便mult = "first"
返回 future 允许范围内最接近的匹配项。必须分配中间列 max_departure
并随后将其删除,因为非等连接只能使用现有列。另请注意,使用的语法来自 this answer(使用 .SD
而不是 df1
的版本在这种情况下不起作用,我不知道为什么)。
编辑:根据评论,我突然想到,当你说“重复”时,你可能指的是不同的东西。假设您计划在 10 点和 10:30 出发,但是 10 点的那个永远不会发生,观察到的出发时间是 10:31。也许您的意思是 10:31 是观察到的预定于 10:30 出发的航类,并且不能用于 10 点的那个?如果是这样的话,也许这会起作用:
setkey(df1, departure)
setkey(df2, departure)
max_dep <- function(departure) {
max_departure <- departure + as.difftime(1, units = "hours")
next_departure <- shift(departure,
fill = max_departure[length(max_departure)] + as.difftime(1, units = "secs"),
type = "lead")
invalid_max <- max_departure >= next_departure
max_departure[invalid_max] <- next_departure[invalid_max] - as.difftime(1, units = "secs")
max_departure
}
df1[, max_departure := max_dep(departure), by = "stop_id"
][, observed_departure := df2[df1,
x.departure,
on = .(stop_id, departure >= departure, departure <= max_departure),
mult = "first"]
][, max_departure := NULL]
max_dep
助手检查,对于每一站和预定的出发时间,下一次预定起飞时间是什么时候,如果下一次出发时间在一小时内,则将 max_departure
设置为“next -1 second”。
其他解决方案对此不起作用,因为,只要观察到的出发时间在预定出发时间的一小时内,这是一个有效的选择。在我的示例中,这意味着 10:31 对 10:30 和 10 都有效。
关于通过两个变量滚动加入 Data.Table 而不创建重复项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58145886/
这个问题在这里已经有了答案: 关闭 10 年前。 Possible Duplicate: How to nest OR statements in JavaScript? 有没有办法做到这一点:
在 JavaScript 中有没有办法让一个变量总是等于一个变量?喜欢var1 = var2但是当var2更新,也是var1 . 例子 var var1 = document.getElementBy
我正在努力理解这代表什么 var1 = var2 == var3 我的猜测是这等同于: if (var2 == var3): var1 = var2 最佳答案 赋值 var1 = var2
这个问题已经有答案了: What does the PHP error message "Notice: Use of undefined constant" mean? (2 个回答) 已关闭 8
我在临时表中有几条记录,我想从每条记录中获取一个值并将其添加到一个变量中,例如 color | caption -------------------------------- re
如何将字符串转为变量(字符串变量--> $variable)? 或者用逗号分隔的变量列表然后转换为实际变量。 我有 2 个文件: 列名文件 行文件 我需要根据字符串匹配行文件中的整行,并根据列名文件命
我有一个我无法解决的基本 php 问题,我也想了解为什么! $upperValueCB = 10; $passNodeMatrixSource = 'CB'; $topValue= '$uppe
这可能吗? php $variable = $variable1 || $variable2? 如果 $variable1 为空则使用 $variable2 是否存在类似的东西? 最佳答案 PHP 5
在 Perl 5.20 中,for 循环似乎能够修改模块作用域的变量,但不能修改父作用域中的词法变量。 #!/usr/bin/env perl use strict; use warnings; ou
为什么这不起作用: var variable; variable = variable.concat(variable2); $('#lunk').append(variable) 我无法弄清楚这一点
根据我的理解,在32位机器上,指针的sizeof是32位(4字节),而在64位机器上,它是8字节。无论它们指向什么数据类型,它们都有固定的大小。我的计算机在 64 位上运行,但是当我打印包含 * 的大
例如: int a = 10; a += 1.5; 这运行得很完美,但是 a = a+1.5; 此作业表示类型不匹配:无法从 double 转换为 int。所以我的问题是:+= 运算符 和= 运算符
您好,我写了这个 MySQL 存储过程,但我一直收到这个语法错误 #1064 - You have an error in your SQL syntax; check the manual that
我试图在我的场景中显示特定的奖牌,这取决于你的高分是基于关卡的目标。 // Get Medal Colour if levelHighscore goalScore { sc
我必须维护相当古老的 Visual C++ 源代码的大型代码库。我发现代码如下: bIsOk = !!m_ptr->isOpen(some Parameters) bIsOk的数据类型是bool,is
我有一个从 MySQL 数据库中提取的动态产品列表。在 list 上有一个立即联系 按钮,我正在使用一个 jquery Modal 脚本,它会弹出一个表单。 我的问题是尝试将产品信息变量传递给该弹出窗
这个问题在这里已经有了答案: 关闭 10 年前。 Possible Duplicate: What is the difference between (type)value and type(va
jQuery Core Style Guidelines建议两种不同的方法来检查变量是否已定义。 全局变量:typeof variable === "undefined" 局部变量:variable
这个问题已经有答案了: 已关闭11 年前。 Possible Duplicate: “Variable” Variables in Javascript? 我想肯定有一种方法可以在 JavaScrip
在语句中使用多重赋值有什么优点或缺点吗?在简单的例子中 var1 = var2 = true; 赋值是从右到左的(我相信 C# 中的所有赋值都是如此,而且可能是 Java,尽管我没有检查后者)。但是,
我是一名优秀的程序员,十分优秀!