我正在重写一些分析大量数据(大约1700万行)的R脚本,我想我会尝试通过使用data.table包来提高它的内存效率(我只是学习它!).
代码的一部分让我感到困惑.我不能发布我的原始解决方案,因为(1)它是废话(慢!),(2)它对数据非常细微差别,并且只会使这个问题复杂化.
相反,我已经制作了这个玩具示例(它确实是一个玩具示例):
ds <- data.table(ID=c(1,1,1,1,2,2,2,3,3,3),
Obs=c(1.5,2.5,0.0,1.25,1.45,1.5,2.5,0.0,1.25,1.45),
Pos=c(1,3,5,6,2,3,5,2,3,4))
Run Code Online (Sandbox Code Playgroud)
看起来像这样:
ID Obs Pos
1: 1 1.50 1
2: 1 2.50 3
3: 1 0.00 5
4: 1 1.25 6
5: 2 1.45 2
6: 2 1.50 3
7: 2 2.50 5
8: 3 0.00 2
9: 3 1.25 3
10: 3 1.45 4
Run Code Online (Sandbox Code Playgroud)
为了便于解释,我假装我们正在观察列车(每列火车都有自己的ID),穿过线性单向轨道,观察(有些价值,而不是问题的重要性)关于正在制作的列车在设定的位置(POS沿着轨道,在这里1-6).预计火车不会使它成为整个轨道的长度(可能在它到达后6之前爆炸),有时观察者会错过观察......位置是连续的(因此,如果我们错过了观察火车在4号位,但我们在5号位观察到它,我们知道它必须通过位置4).
从上面的data.table,我需要生成一个这样的表:
Pos Count
1: 1 3
2: 2 3
3: 3 3
4: 4 3
5: 5 2
6: 6 1 …Run Code Online (Sandbox Code Playgroud) 我使用DESeq2包装适合GLM,并且具有个体(RatID)嵌套在治疗(饮食)中的情况.该软件包的作者建议,每个饮食中的个体从1:N重新调整(其中N是特定饮食中的RatID数),而不是其原始ID /因子水平(DESeq2小插图,第35页).
数据看起来像这样(实际上有更多的列和行,但为简单起见省略):
Diet Extraction RatID
199 HAMSP 8 65
74 HAMS 9 108
308 HAMS 18 100
41 HAMSA 3 83
88 HAMSP 12 11
221 HAMSP 14 66
200 HAMSA 8 57
155 HAMSB 1 105
245 HAMSB 19 50
254 HAMS 21 90
182 HAMSB 4 4
283 HAMSA 23 59
180 HAMSP 4 22
71 HAMSP 9 112
212 HAMS 12 63
220 HAMSP 14 54
56 HAMS 7 81
274 HAMSP 1 11 …Run Code Online (Sandbox Code Playgroud) 从 SO 上的其他地方窃取一个虚拟示例(在确切日期加入 data.table,或者如果不是在最近的小于日期的情况下加入)),我希望根据严格更早的第一个日期(Dt1 中的日期)加入两个表比第二个日期(Dt2 中的日期)。
还关闭了 DataCombine 解决方案“幻灯片”功能中的“警告”消息,因为它可能不公平地减慢了 mtotos 解决方案的速度。
library(data.table)
Dt1 <- read.table(text="
date x
1/26/2010, 10
1/25/2010, 9
1/24/2010, 9
1/22/2010, 7
1/19/2010, 11", header=TRUE, stringsAsFactors=FALSE)
Dt2 <- read.table(text="
date
1/26/2010
1/23/2010
1/20/2010", header=TRUE, stringsAsFactors=FALSE)
Run Code Online (Sandbox Code Playgroud)
加入所需的结果
date x
1/26/2010 - 9 # based on closest observation strictly less than date
1/23/2010 - 7
1/20/2010 - 11
Run Code Online (Sandbox Code Playgroud)
(我保留 data.frame 格式用于输入 mtoto 的解决方案,而 data.table 则用于 jangorecki 的解决方案)。
solution.mtoto = function(Df1, Df2)
{
#Full outer join of …Run Code Online (Sandbox Code Playgroud) 我真的很感激这个问题的一些帮助,我无法在SO上找到足够接近的例子.
我有两个data.tables,第一个叫做customer.table,包含特定时间戳(AsOfDate)的成员快照,第二个表activity.table用于描述发送给该客户的营销活动ActivityDate.
我想找到客户数据表中每条记录的AsOfDate之前或之前发送给成员的最新ActivityDate(即最长日期).
我已经看了几个问题(一个接近的问题是:处理一个ID重复的表),但我不确定如何将条件(ActivityDate <AsOfDate)与活动日期的最大值组合 - 我还希望保留连接中两个表的所有列,因为我需要计算ActivityDate和AsOfDate之间的时间.我仍然没有时间使用roll ...
#libraries
library(lubridate)
library(data.table)
#data
customer.table = structure(list(CustomerID = c(1, 2, 3, 4, 5, 6, 7, 8, 9, 10,
4), AsOfDate = structure(c(1435622400, 1435622400, 1435622400,
1435622400, 1435622400, 1435622400, 1435622400, 1435622400, 1435622400,
1435622400, 1394150400), tzone = "UTC", class = c("POSIXct",
"POSIXt")), distance = c(2.17380476584343, 29.4024827688224,
3.01353310956009, 18.4923143452557, 294.878606580665, 11.8870209430565,
9.54438580030996, 24.2192034858273, 15.0069335290262, 10.4513664447137,
18.4923143452557)), .Names = c("CustomerID", "AsOfDate", "distance"
), row.names = c("1", "5", …Run Code Online (Sandbox Code Playgroud)