好吧。我已经对这个问题进行了大量编辑,以 a) 使其更有意义,并且 b) 反映我遇到的问题所在。
我有两个数据集——我们称它们为 set1 和 set2——每个数据集大约有 600 万行。目前,我将它们作为 data.tables 加载到 R 中。
>set1<-data.table(read.csv('~/file1.csv', stringsAsFactors=F))
>setkey(set1, id1)
>head(set1)
id1 start_unixtime end_unixtime seconds_diff id2
1: 1674 1354741858 1354741858 0 227167461
2: 1674 1354752386 1354752951 565 227246263
3: 1674 1354764412 1354764412 0 227358796
4: 1674 1354773044 1354773776 732 227421295
5: 1674 1354778651 1354778651 0 227448774
6: 1674 1354810424 1354810424 0 227631113
>set2<-data.table(read.csv('~/file2.csv', stringsAsFactors=F))
>setkey(set2, id1)
>head(set2)
id1 unix_timestamp event_name
1: 1674 1355202784 join
2: 1674 1354351118 join
3: 1674 1354349648 play
4: 1674 1354780517 join
5: 1674 1355278891 join
6: 1674 1354617262 join
需要指出的一个有问题的细节: set2 没有唯一键。只有每一行的元组实际上是唯一的。在 set1 中,id2 是唯一的。娱乐时间!
我正在执行的操作是这样的:对于 中的每一行set2
,我需要获取 unix_timestamp,找到set1
wherestart_unixtimestamp <= unix_timestamp <= end_unixtimestamp
和 id1 匹配的行,然后将对应set1.id2
的行分配给set2
. in 的每一行set2
都有一个 in 的条目set1
,但不是 in 的每一行set1
都有一个 in 的条目set2
。一个id2
可以分配给set2
. 我需要结束的是这个(注意:以下数据是假的,因为我还没有能够产生任何实际的成功。):
>head(set2)
id1 unix_timestamp event_name id2
1: 1674 1355202784 join 227167461
2: 1674 1354351118 join 227157309
3: 1674 1354349648 play 227157309
4: 1674 1354780517 join 227157309
5: 1674 1355278891 join 271089456
6: 1674 1354617262 join 221729485
这是我制作的一堆乱七八糟的数据表:
set2[, id2 := set1[set2[, id1], list(start_unixtime, end_unixtime, id2)][(start_unixtime <= unix_timestamp & unix_timestamp <= end_unixtime), id2, by=id2]][, list(id2)][, id2:= id2]
谈论我所理解的事情:
set2
调用赋值运算符:=
- 右侧调用
set1
,它joining
从 set2 中的 id1 行开始。 start_unixtime
、end_unixtime
和列id2
被选中。- 根据该结果,完成了第二组选择,它得到
id2
了utc_timestamp
of和id2
之间的位置。start_unixtime
end_unixtime
- ......在这里,我认为我做错了 - 因为在这一步,我似乎总是有两列,每列都标记
id2
并包含相同的结果。所以,我选择一列... - ...并指定它进行分配。(我不知道为什么要这样做两次。我发现了这个 SO 帖子,它使用了第二个
:=
,而这个没有,我根本不知道为什么。
...这是行不通的。@mnel 提出了类似的建议:
set2[set1, nomatch=0][unix_timestamp %between c(start_unixtime, end_unixtime, incbounds=T)]
...当我用他的测试数据尝试它时,它有效,但不适用于我的数据。我突然想到我的数据可能是某种类型(字符?),它data.table
(或 R 句点)可能无法正确强制?我可能很密集,但我似乎无法弄清楚如何调用as.integer()
a 的指定列data.table
。
编辑:是的,我的数据都是字符,我忘记了data.table
继承自data.frame
. 所以,一点点set1$start_unixtime <- as.integer($set1$start_unixtime)
,至少我确信一切都是整数。但是,当我运行该命令时,我仍然得到这个:
>head(set2)
Empty data.table (0 rows) of 8 cols: id1,utc_timestamp,event_name,start_unixtime,end_unixtime,seconds_diff...
加法 这里是我的实际数据的片段:
set1 <- as.data.table(list(id1 = c(1674L, 1674L, 1674L, 1674L, 1674L, 1674L),
start_unixtime = c(1354741858L, 1354752386L, 1354764412L, 1354773044L, 1354778651L, 1354810424L),
end_unixtime = c(1354741858L, 1354752951L, 1354764412L, 1354773776L, 1354778651L, 1354810424L),
seconds_diff = c(0L, 565L, 0L, 732L, 0L, 0L),
id2 = c(227167461L, 227246263L, 227358796L, 227421295L, 227448774L, 227631113L))
set2 <- as.data.table(list(
id1 = c(1674L, 1674L, 1674L, 1674L, 1674L, 1674L),
utc_timestamp = c(1354752431L, 1354780517L, 1354811978L, 1354824385L, 1354833271L, 1354862753L),
event_name = c("joinRegularTable_2", "joinRegularTable_2", "joinRegularTable_2", "joinRegularTable_2","joinRegularTable_2", "joinRegularTable_2"))