【问题标题】:Efficient Way to Build Data Frame / Data Table构建数据框/数据表的有效方法
【发布时间】:2015-03-24 04:31:24
【问题描述】:

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

states_grid <- expand.grid(years = c(1:47), start_pct = c(0:99), sim_num = c(1:50))

上面的代码创建了我想要模拟的所有状态。我的问题变成了创建一个 data.frame 来保存输出。我想做的是创建一个更大的数据框,我们在其中添加一个 ob_num 变量。 ob_num 变量将从 1 运行到第 1 列中指示的年数。

例如:

   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

但是我想不出一种有效的方法来创建这个数据框。

想法?

编辑:我尝试了以下建议,但似乎没有这样做。

以下代码返回相同大小 (235,000) 行的 data.table。

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][]

两种方法都返回 235K 行。

【问题讨论】:

  • 您的意思是states_grid 中的每一行都应该被复制years 次,然后应该创建一个新列ob_num,其中包含从1 到years 的序列?
  • library(data.table)尝试setDT(states_grid)[, ob_num := 1:.N, by= years][]
  • 创建一个由sim_numob_num 键控的单独data.table 是有效的。 yearsstart_pct 始终可以合并回来(因为它们完全由 sim_num 确定)。
  • 弗兰克,我不确定你的意思,但很乐意了解更多信息。仅供参考 - 由于时间限制,我最终在 Rcpp 中写了这个,但是了解是否有办法有效地处理这个问题会更好(也许是弗兰克的解决方案!)。
  • 您希望它返回多少行?你能展示一个小的前后例子吗?

标签: r dataframe data.table


【解决方案1】:
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

【讨论】:

  • 谢谢先生!我新有一种简单/有效的方法来做到这一点
猜你喜欢
  • 2020-11-23
  • 2019-09-06
  • 2014-02-13
  • 2016-11-05
  • 2021-10-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多