我可以把这个dplyr+;data.table任务更快?
我想这更像是一个我可以把这个dplyr+;data.table任务更快?,r,data.table,dplyr,R,Data.table,Dplyr,我想这更像是一个dplyr问题,而不是plyr问题。为了提高速度,我在我编写的一些代码中使用了data.table。在中间步骤中,我有一个包含约32000行基因组数据的表格: > bedbin.dt Source: local data table [32,138 x 4] Groups: chr bin start site chr 1 2 3500000 ssCTCF 1 2 3 4000000 ssCTCF+Cohesi
dplyr
问题,而不是plyr
问题。为了提高速度,我在我编写的一些代码中使用了data.table
。在中间步骤中,我有一个包含约32000行基因组数据的表格:
> bedbin.dt
Source: local data table [32,138 x 4]
Groups: chr
bin start site chr
1 2 3500000 ssCTCF 1
2 3 4000000 ssCTCF+Cohesin 1
3 3 4000000 ssCTCF 1
4 4 4500000 ucCTCF 1
5 4 4500000 ssCTCF+Cohesin 1
6 4 4500000 ssCTCF+Cohesin 1
7 4 4500000 ssCTCF+Cohesin 1
8 4 4500000 ssCTCF 1
9 4 4500000 ssCTCF 1
10 5 5000000 ssCTCF 1
.. ... ... ... ...
编辑
或者像这样的前一百行数据(thx给里卡多·萨波尔塔的指令)
在我看来,这是slooowwww…尽管相对使用data.frame
,或者像by()
或lappy()
这样的基本函数来说,这要快得多。然而,这实际上是一个很小的数据集,我正在测试它
所以。。。我想知道是否有人对outerFun的更快版本有什么想法???有没有比
rep()
或rep.int()
更快的方法?正如里卡多所指出的,听起来你只是想要这样:
bedbin.dt[, CJ(1:.N, 1:.N), by = chr]
嗨,你能发布一个可复制的例子吗?--您可以使用
repearch()
。说明如下:-@RicardoSaporta,你好,我不确定如何发布一个完全可复制的示例。让我想想。也许我可以先编写代码来创建它??请稍等……看看我贴的链接。您可以简单地使用repearch(bedbin.dt,rows=100,cols=c(“bin”,“start”…)等))
不清楚您到底在做什么,但看起来您可能只是在寻找CJ
函数?所以您想要交叉联接?你能解释一下原因吗?通常情况下,您不希望组合爆炸您拥有的数据量。我认为您应该将其存储在一个变量中,比如,tt
,然后执行:cbind(dt[tt$V1],dt[tt$V2])
,但不确定。在测试数据上,这为我自己的函数(1936)提供了不同的答案(5288行),而不是我想要的所有列。然而,CJ看起来确实是一个很有前途的功能。。。。但是我在数据表语法方面真的很弱,我需要去谷歌一下,直到我明白这里到底发生了什么。thx.@StephenHenderson抱歉,我无法安装dplyr
,也不确定该代码的作用-这是我最好的猜测-CJ
大致相同expand.grid
btw@eddi是的,我想这已经接近我想要的了,而且要快一点。。但我不认为是1:.N,例如,在原始数据中没有bin=1,但在您的答案中有。因此,我可以使用您所做的-不知道CJ()-但只需要掌握语法就可以自己解决它。谢谢again@StephenHenderson,如果您获取一个小数据并向我们展示您想要的输出,可能会有所帮助。
# grouped by chr column
bedbin.dt = group_by(bedbin.dt, chr)
# an outer like function
outerFun= function(dt)
{
unique(data.table(
x=dt[rep(1:nrow(dt),each =nrow(dt)),],
y=dt[rep.int(1:nrow(dt),times=nrow(dt)),]))
}
> system.time((outer.bedbin.dt = do(bedbin.dt, outerFun1)))
user system elapsed
90.607 13.993 105.536
bedbin.dt[, CJ(1:.N, 1:.N), by = chr]