Dynami c создание data.frame / data.table / tibble - PullRequest
0 голосов
/ 26 марта 2020

Я вычисляю K метрик и N сессий. Мне нужно создать один data.frame или data.table или tibble динамически (алгоритмически) со всеми накопленными результатами - как показано ниже. В этом случае K равно 4, а N равно 2.

dtAllResults <- data.table(
  `Session 1 Metric 1` = strStats.res[[1]],
  `Session 1 Metric 2` = strStats.res[[2]],
  `Session 1 Metric 3` = strStats.res[[3]],
  `Session 1 Metric 4` = strStats.res[[4]],
  `Session 2 Metric 1` = strStats.res[[5]],
  `Session 2 Metric 2` = strStats.res[[6]],
  `Session 2 Metric 3` = strStats.res[[7]],
  `Session 2 Metric 4` = strStats.res[[8]]
)

Как это сделать?
Я подозреваю, что это должно быть сделано с get, as.name, substitute или quote каким-то образом, но какую бы комбинацию из них я ни пробовал, это не сработало.

Чтобы сделать воспроизводимый пример, я включил код для инициализации всех переменных:

set.seed(1); strStats.res <- list(); N=2; K=4;
for( i in N*K) { strStats.res[[i]] <- runif(1) }

1 Ответ

1 голос
/ 27 марта 2020

Я думаю, что NSE не требуется, по крайней мере, на основе вашего MWE. Вот вариант:

nm <- do.call(paste, CJ(paste("Session", 1L:N), paste("Metric", 1L:K)))
setnames(as.data.table(strStats.res), nm)[]

вывод:

   Session 1 Metric 1 Session 1 Metric 2 Session 1 Metric 3 Session 1 Metric 4 Session 2 Metric 1 Session 2 Metric 2 Session 2 Metric 3 Session 2 Metric 4
1:          0.2655087          0.3721239          0.5728534          0.9082078          0.2016819          0.8983897          0.9446753          0.6607978

данные:

set.seed(1)
strStats.res <- list()
N=2
K=4
for (i in seq_len(N*K)) { 
    strStats.res[[i]] <- runif(1) 
}
...