R 构建数据帧/数据表的有效方法

R 构建数据帧/数据表的有效方法,r,dataframe,data.table,R,Dataframe,Data.table,我有一个data.frame,用于设置模拟参数 states_grid <- expand.grid(years = c(1:47), start_pct = c(0:99), sim_num = c(1:50)) 然而,我想不出一个有效的方法来创建这个数据帧 想法 编辑:我试过下面的建议,但似乎不行 下面的代码返回相同大小(235000)行的data.table states\u grid您的意思是states\u grid中的每一行都应该复制年次,然后创建一个新列ob\u num,其

我有一个data.frame,用于设置模拟参数

states_grid <- expand.grid(years = c(1:47), start_pct = c(0:99), sim_num = c(1:50))
然而,我想不出一个有效的方法来创建这个数据帧

想法

编辑:我试过下面的建议,但似乎不行

下面的代码返回相同大小(235000)行的data.table


states\u grid
您的意思是
states\u grid
中的每一行都应该复制
次,然后创建一个新列
ob\u num
,其中包含从1到
年的序列
?Try
setDT(states\u grid)[,ob num:=1.N,by=years][/code>自
库(data.table)
创建一个单独的数据表非常有效。表由
sim_num
ob_num
键控。您总是可以将
年数
开始pct
(因为它们完全由
sim_num
决定)。弗兰克,我不确定您的意思,但很乐意了解更多。仅供参考-由于时间限制,我最终在Rcpp中写了这篇文章,但更重要的是要了解是否有一种方法可以有效地处理这个问题(也许是Frank的解决方案!)。您希望它返回多少行?你能展示一个小的前后示例吗?谢谢你,先生!我认为有一种简单/有效的方法可以做到这一点
   years start_pct sim_num ob_num
1:     2        99       1      1
2:     2        99       1      2
3:     3        99       1      1
4:     3        99       1      2
5:     3        99       1      3
6:     4        99       1      1
7:     4        99       1      2
8:     4        99       1      3
9:     4        99       1      4
states_grid <- expand.grid(years = c(1:(year_max - year_min + 1)),
                           start_pct = c(0:99),
                           sim_num = c(1:50))
states_grid <- data.table(states_grid)
setDT(states_grid)[, ob_num := 1:.N, by = years][]
states_grid <- setDT(states_grid)[, ob_num := 1:.N, by = years][]
CJ(years = c(1:47), start_pct = c(0:99), sim_num = c(1:50))[,
   .(ob_num = seq_len(years)), by = .(years, start_pct, sim_num)]
#         years start_pct sim_num ob_num
#      1:     1         0       1      1
#      2:     1         0       2      1
#      3:     1         0       3      1
#      4:     1         0       4      1
#      5:     1         0       5      1
#     ---                               
#5639996:    47        99      50     43
#5639997:    47        99      50     44
#5639998:    47        99      50     45
#5639999:    47        99      50     46
#5640000:    47        99      50     47