Используйте динамические имена для CJ в data.table - PullRequest
0 голосов
/ 19 декабря 2018

Я хочу использовать CJ с гибким количеством столбцов с гибкими именами, например,

J = 3
temp = CJ(paste0('Q', 1) = 0:100)
if(J > 1){
  for(j in 2:J){
    temp = CJ(temp,paste0('Q', j) = 0:100))
  }
}

Для произвольного J.

Где вывод:

CJ(Q1 = 0:100, Q2 = 0:100, Q3 = 0:100)


          Q1  Q2  Q3
      1:   0   0   0
      2:   0   0   1
      3:   0   0   2
      4:   0   0   3
      5:   0   0   4
     ---            
1030297: 100 100  96
1030298: 100 100  97
1030299: 100 100  98
1030300: 100 100  99
1030301: 100 100 100

1 Ответ

0 голосов
/ 19 декабря 2018

Это классический случай для do.call:

temp = do.call(CJ, replicate(J, 0:100, simplify = FALSE))
setnames(temp, paste0('Q', 1:J))
temp
#           Q1  Q2  Q3
#       1:   0   0   0
#       2:   0   0   1
#       3:   0   0   2
#       4:   0   0   3
#       5:   0   0   4
#      ---            
# 1030297: 100 100  96
# 1030298: 100 100  97
# 1030299: 100 100  98
# 1030300: 100 100  99
# 1030301: 100 100 100

Можно построить это в одну строку, используя setNames и lapply вместо replicate, но гораздо менее читаемый IMO.setnames почти мгновенно, поэтому не стоит беспокоиться об эффективности.

...