【问题标题】:Use dynamic names for CJ in data.table在 data.table 中为 CJ 使用动态名称
【发布时间】:2019-05-19 10:34:21
【问题描述】:

例如,我想将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

【问题讨论】:

    标签: r join merge data.table


    【解决方案1】:

    这是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 几乎是即时的,所以没有效率问题。

    【讨论】:

      猜你喜欢
      • 2013-02-02
      • 2012-10-08
      • 1970-01-01
      • 2012-07-29
      • 1970-01-01
      • 2014-11-18
      • 2023-03-27
      • 2017-11-17
      • 1970-01-01
      相关资源
      最近更新 更多