Мне нужно разработать корреляционную матрицу 2886 * 2886, проблема в том, что для создания промежуточного datatable (RESULT
) требуется много времени, чтобы связать ее, чтобы я мог выполнять следующие действия, в то время как вызывая последнюю строку RESULT=rbindlist(apply(COMB, 1, append))
в коде ниже:
- Оцените время, необходимое для завершения функции apply
- Отслеживать его прогресс.
- Возможность приостановки и продолжения в более позднее время
Вот код:
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))
Любая идея?
Также вы знаете, есть ли более быстрый способ генерации datatable RESULT
из SOURCE
? RESULT
является промежуточным datatable для вычисления значений корреляции между VALUE1
и VALUE2
для каждой пары NAME
.
С подмножеством 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")]
Поэтому, возможно, весь процесс можно сделать более эффективно, кто знает.