Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/apache/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
我可以把这个dplyr+;data.table任务更快?_R_Data.table_Dplyr - Fatal编程技术网

我可以把这个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]