- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个数据集(“出价”),它由一系列观察值(约 500 万)组成,每个观察值代表购买产品(在下面的简化示例中,一本书或游戏)的出价。对于每次观察,我都有(参见下面的示例数据):
投标人姓名
observation date time product bidder
1 1/1/2016 9:00:00 AM book AB
2 1/1/2016 9:01:00 AM book CD
3 1/1/2016 9:02:00 AM book EF
4 1/1/2016 9:03:00 AM book CD
5 1/1/2016 9:00:00 AM game AB
6 1/1/2016 9:01:00 AM game CD
7 1/1/2016 9:02:00 AM game CD
8 1/1/2016 9:07:00 AM game CD
9 1/2/2016 9:00:00 AM book AB
10 1/2/2016 9:06:00 AM book CD
11 1/2/2016 9:02:00 AM book EF
12 1/2/2016 9:03:00 AM book EF
13 1/2/2016 9:00:00 AM game EF
14 1/2/2016 8:59:00 AM game CD
15 1/2/2016 9:00:00 AM game GH
16 1/2/2016 9:01:00 AM game AB
17 1/2/2016 10:00:00 AM game AB
18 1/2/2016 10:06:00 AM game CD
19 1/2/2016 10:06:00 AM game EF
20 1/2/2016 10:06:00 AM game GH
21 1/2/2016 3:00:00 PM game AB
在某些情况下,一个投标人对某一特定产品进行了一次投标,而没有其他投标人对该产品进行过一次投标(例如,观察 #21)。然而,在大多数情况下,同一产品的多个投标人的多个投标在时间上非常接近(例如,观察 1-4 组成一个组;观察 14-16 组成一个组)。要研究这些组,我需要能够对它们进行分组并使用唯一标识符来标识每个组。最终,我还需要能够计算出每组中的出价总数以及每组中唯一/不同的出价者的数量。如果我弄清楚如何创建组,我可能可以自己解决这个问题,但我提到它是为了防止有更简单/更集成的方法。
我遇到的问题是“及时关闭”参数。如果“及时关闭”意味着同一天,我很清楚我可以在 plyr 中使用 id 并创建一个新列(“bidgrp”)(或其他几种方法中的任何一种)。像这样的东西:
bids$bidgrp <- id(bids[c("date", "product")], drop = TRUE)
但是,“及时关闭”实际上是指在 5 分钟内。换句话说,例如,观察值 9、11 和 12 是组的一部分,但 10 - 因为它比组中最早的成员 (9) 晚 5 分钟以上,所以不属于该组。挑战的一部分是弄清楚如何确定组中的第一个(最早)成员是什么(我没有可靠的指标,所以 [this] ( Grouping observations based on first row value ) 解决方案不起作用,但这可能是通过在尝试任何分组之前对数据进行排序来完成(尽管再次强调,如果有更聪明、更有效的方法来做到这一点,我会欢迎他们)
通过查看 SO 和其他地方的其他条件分组问题,我的直觉是通过一系列类似 ifelse 循环的步骤来解决这个问题,如下所示:
结果(对于上面的示例数据),将确定 9 个组,如下所示:
observation date time product bidder grpid
1 1/1/2016 9:00:00 AM book AB 1
2 1/1/2016 9:01:00 AM book CD 1
3 1/1/2016 9:02:00 AM book EF 1
4 1/1/2016 9:03:00 AM book CD 1
5 1/1/2016 9:00:00 AM game AB 2
6 1/1/2016 9:01:00 AM game CD 2
7 1/1/2016 9:02:00 AM game CD 2
8 1/1/2016 9:07:00 AM game CD 3
9 1/2/2016 9:00:00 AM book AB 4
11 1/2/2016 9:02:00 AM book EF 4
12 1/2/2016 9:03:00 AM book EF 4
10 1/2/2016 9:06:00 AM book CD 5
14 1/2/2016 8:59:00 AM game CD 6
13 1/2/2016 9:00:00 AM game EF 6
15 1/2/2016 9:00:00 AM game GH 6
16 1/2/2016 9:01:00 AM game AB 6
17 1/2/2016 10:00:00 AM game AB 7
18 1/2/2016 10:06:00 AM game CD 8
19 1/2/2016 10:06:00 AM game EF 8
20 1/2/2016 10:06:00 AM game GH 8
21 1/2/2016 3:00:00 PM game AB 9
而且,我最终需要做这样的事情:
grpid bids uniquebidders
1 4 3
2 3 2
3 1 1
4 3 2
5 1 1
6 4 4
7 1 1
8 3 3
9 1 1
很抱歉问了这么长的问题。我知道这里的几个子问题(与时间一起工作;类似循环的操作)已经涵盖在 SO 中(我已经审查了其中的许多),但是正是这些问题的结合使这对我来说特别具有挑战性(并且希望对其他人有用)。
在此先感谢您提供的任何帮助。
最佳答案
您可以为日期时间比较创建一个特定的函数。我知道它是否适用于 500 万行,但它适用于示例数据集。我按照你的步骤。它使用 rleid
创建游程类型 id 列。使用它两次,您将获得所需的组 ID。有意按部就类,但可以写得更简洁。
library(data.table)
setDT(DT)
# this function compare each datetime of the vector with the first one
# If > 5 mins then a new time reference is set for next group and group
# is incremented
func_perso <- function(vec){
time1 <- vec[1]
grp <- 1
res <- vector("integer", length(vec))
for(i in 1:length(vec)){
time <- vec[i]
if(difftime(time, time1, units = "secs") > 5*60){
grp <- grp + 1
time1 <- time
}
res[i] <- grp
}
res
}
# Create a datetime object (POSIXct) for easier comparaison
DT[, dtime := as.POSIXct(strptime(paste(date, time), "%d/%m/%Y %I:%M:%S %p", tz = "UTC"))]
# order data as you mentionned
setorder(DT, date, product, dtime)
# Apply func on column dtime by data and product
DT[, grp1 := .SD[, func_perso(dtime)], by = .(date, product)]
# use rleid to count identify the group
DT[, grp2 := paste0(product, rleid(grp1)), by = .(date, product)]
# count the group
DT[, grpid := rleid(grp2)]
# delete non necessary column
DT[, `:=`(
dtime = NULL,
grp1 = NULL,
grp2 = NULL
)]
# the result
DT
#> Observation date time product bidder grpid
#> 1: 1 1/1/2016 9:00:00 AM book AB 1
#> 2: 2 1/1/2016 9:01:00 AM book CD 1
#> 3: 3 1/1/2016 9:02:00 AM book EF 1
#> 4: 4 1/1/2016 9:03:00 AM book CD 1
#> 5: 5 1/1/2016 9:00:00 AM game AB 2
#> 6: 6 1/1/2016 9:01:00 AM game CD 2
#> 7: 7 1/1/2016 9:02:00 AM game CD 2
#> 8: 8 1/1/2016 9:07:00 AM game CD 3
#> 9: 9 1/2/2016 9:00:00 AM book AB 4
#> 10: 11 1/2/2016 9:02:00 AM book EF 4
#> 11: 12 1/2/2016 9:03:00 AM book EF 4
#> 12: 10 1/2/2016 9:06:00 AM book CD 5
#> 13: 14 1/2/2016 8:59:00 AM game CD 6
#> 14: 13 1/2/2016 9:00:00 AM game EF 6
#> 15: 15 1/2/2016 9:00:00 AM game GH 6
#> 16: 16 1/2/2016 9:01:00 AM game AB 6
#> 17: 17 1/2/2016 10:00:00 AM game AB 7
#> 18: 18 1/2/2016 10:06:00 AM game CD 8
#> 19: 19 1/2/2016 10:06:00 AM game EF 8
#> 20: 20 1/2/2016 10:06:00 AM game GH 8
#> 21: 21 1/2/2016 3:00:00 PM game AB 9
#> Observation date time product bidder grpid
关于r - 使用 R 根据逻辑条件和它们发生的时间接近程度来识别和分组相关观察,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35816461/
我正在努力处理查询的 WHERE 部分。查询本身包含一个基于两个表中都存在的 ID 的 LEFT JOIN。但是,我要求 where 语句仅返回其中一列中存在的最大单个结果。目前我返回连接中的所有值,
我有这个代码来改变文件系统的大小。问题是,即使满足 if 条件,它也不会进入 if 条件,而我根本没有检查 if 条件。它直接进入 else 条件。 运行代码后的结果 post-install-ray
假设我有一个包含 2 列的 Excel 表格:单元格 A1 到 A10 中的日期和 B1 到 B10 中的值。 我想对五月日期的所有值求和。我有3种可能性: {=SUM((MONTH(A1:A10)=
伪代码: SELECT * FROM 'table' WHERE ('date' row.date 或 ,我们在Stack Overflow上找到一个类似的问题: https://stackove
我有下面这行代码做一个简单的查询 if ($this->fulfilled) $criteria->addCondition('fulfilled ' . (($this->fulfilled
如果在数据库中找到用户输入的键,我将尝试显示“表”中的数据。目前我已将其设置为让数据库检查 key 是否存在,如下所示: //Select all from table if a key entry
关闭。此题需要details or clarity 。目前不接受答案。 想要改进这个问题吗?通过 editing this post 添加详细信息并澄清问题. 已关闭 5 年前。 Improve th
在MYSQL中可以吗 一共有三个表 任务(task_id、task_status、...) tasks_assigned_to(ta_id、task_id、user_id) task_suggeste
我想先根据用户的状态然后根据用户名来排序我的 sql 请求。该状态由 user_type 列设置: 1=活跃,2=不活跃,3=创始人。 我会使用此请求来执行此操作,但它不起作用,因为我想在“活跃”成员
下面两个函数中最专业的代码风格是什么? 如果函数变得更复杂和更大,例如有 20 个检查怎么办? 注意:每次检查后我都需要做一些事情,所以我不能将所有内容连接到一个 if 语句中,例如: if (veh
我在 C# 项目中使用 EntityFramework 6.1.3 和 SQL Server。我有两个查询,基本上应该执行相同的操作。 1. Exams.GroupBy(x=>x.SubjectID)
我试图在 case when 语句中放入两个条件,但我在 postgresql 中遇到语法错误 case when condition 1 and condition 2 then X else Y
我正在构建一个连接多个表的查询,一个表 prodRecipe 将包含某些行的数据,但不是全部,但是 tmp_inv1 将包含所有行的计数信息。问题是,tmp_inv1.count 取决于某个项目是否在
我有一个涉及 couples of rows which have a less-than-2-hours time-difference 的查询(~0.08333 天): SELECT mt1.*,
我有一个包含许多这样的 OR 条件的代码(工作正常)来检查其中一个值是否为空,然后我们抛出一条错误消息(所有这些都必须填写) } elsif ( !$params{'account'}
我有一个名为 spGetOrders 的存储过程,它接受一些参数:@startdate 和 @enddate。这将查询“订单”表。表中的一列称为“ClosedDate”。如果订单尚未关闭,则此列将保留
在代码中,注释部分是我需要解决的问题...有没有办法在 LINQ 中编写这样的查询?我需要这个,因为我需要根据状态进行排序。 var result = ( from contact in d
我正在尝试创建一个允许省略参数的存储过程,但如果提供了参数,则进行 AND 操作: CREATE PROCEDURE MyProcedure @LastName Varchar(30)
我正在寻找一种方法来过滤我的主机文件中的新 IP 地址。我创建了一个脚本,每次我用来自矩阵企业管理器的数据调用它时都会更新我的主机文件。它工作正常。但是我必须找到一个解决方案,只允许更新 10.XX.
所以我正在做一种 slider ,当它完全向下时隐藏向下按钮,反之亦然,当向上按钮隐藏时,我遇到了问题。 var amount = $('slide').attr('number'); $('span
我是一名优秀的程序员,十分优秀!