在data.table中为CJ使用动态名称

时间:2018-12-18 23:41:19

标签: r join merge data.table

例如,我想将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 :(得分:2)

这是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

可以使用setNameslapply而不是replicate在一行中构造它,但是IMO的可读性要差得多。 setnames几乎是瞬时的,因此没有效率问题。