【发布时间】:2016-09-21 09:03:35
【问题描述】:
我需要计算出一个 2886*2886 的相关矩阵,问题是构建中间数据表 (RESULT) 需要很长时间才能将其绑定在一起,所以我希望能够在执行以下操作的同时在下面的代码中调用最后一行RESULT=rbindlist(apply(COMB, 1, append)):
- 估计完成应用函数所需的时间
- 监控其进度
- 以后可以暂停并继续
代码如下:
SOURCE=data.table(NAME=rep(paste0("NAME", as.character(1:2889)), each=600), VALUE=sample(c(TRUE,FALSE), 600, TRUE) )
> SOURCE
NAME VALUE
1: NAME1 TRUE
2: NAME1 TRUE
3: NAME1 TRUE
4: NAME1 TRUE
5: NAME1 TRUE
---
1733396: NAME999 TRUE
1733397: NAME999 TRUE
1733398: NAME999 TRUE
1733399: NAME999 TRUE
1733400: NAME999 FALSE
setkey(SOURCE,NAME)
a=SOURCE[,unique(NAME)]
COMB=data.table(expand.grid(a,a, stringsAsFactors=FALSE))
> COMB
Var1 Var2
1: NAME1 NAME1
2: NAME10 NAME1
3: NAME100 NAME1
4: NAME1000 NAME1
5: NAME1001 NAME1
---
8346317: NAME995 NAME999
8346318: NAME996 NAME999
8346319: NAME997 NAME999
8346320: NAME998 NAME999
8346321: NAME999 NAME999
append <- function(X) {
data.table(NAME1=X[1], VALUE1=SOURCE[X[1], VALUE],
NAME2=X[2], VALUE2=SOURCE[X[2], VALUE] )
}
RESULT=rbindlist(apply(COMB, 1, append))
有什么想法吗?
您还知道是否有更快的方法从SOURCE 生成数据表RESULT? RESULT 是一个中间数据表,用于计算每对 NAME 的 VALUE1 和 VALUE2 之间的相关值。
SOURCE 的子集RESULT看起来像这样:
SOURCE=SOURCE[sample(1:nrow(SOURCE), 3)]
setkey(SOURCE,NAME)
a=SOURCE[,unique(NAME)]
COMB=data.table(expand.grid(a,a, stringsAsFactors=FALSE))
RESULT=rbindlist(apply(COMB, 1, append))
> RESULT
NAME1 VALUE1 NAME2 VALUE2
1: NAME1859 TRUE NAME1859 TRUE
2: NAME768 FALSE NAME1859 TRUE
3: NAME795 TRUE NAME1859 TRUE
4: NAME1859 TRUE NAME768 FALSE
5: NAME768 FALSE NAME768 FALSE
6: NAME795 TRUE NAME768 FALSE
7: NAME1859 TRUE NAME795 TRUE
8: NAME768 FALSE NAME795 TRUE
9: NAME795 TRUE NAME795 TRUE
稍后我将执行RESULT[,VALUE3:=(VALUE1==VALUE2)] 以最终获得相关值:RESULT[, mean(VALUE3), by=c("NAME1", "NAME2")]
所以也许整个过程可以更有效地完成,谁知道呢。
【问题讨论】:
-
为了进步,我经常在函数的开头添加一行,例如
lapply(1:nrow(f), function(i){print(i/nrow(f)# your function})
标签: r data.table apply