小编Mee*_*eep的帖子

复杂的汇总功能 - 是否可以使用R data.table包解决?

我正在重写一些分析大量数据(大约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)

r data.table

20
推荐指数
2
解决办法
606
查看次数

重新调整因子以便于在R中的DESeq2模型中用作嵌套因子

我使用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)

r bioconductor data.table

5
推荐指数
1
解决办法
376
查看次数

按日期连接两个 data.table,表 1 中最接近的日期严格小于第二个表中的日期

从 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)

r data.table

4
推荐指数
1
解决办法
1377
查看次数

Data.table:加入ID和Date键,但希望在第一个表中的日期键之前(或等于)最接近的日期

我真的很感激这个问题的一些帮助,我无法在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)

r data.table

2
推荐指数
1
解决办法
769
查看次数

标签 统计

data.table ×4

r ×4

bioconductor ×1