Это классический случай для 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
почти мгновенно, поэтому не стоит беспокоиться об эффективности.