【发布时间】: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_num和ob_num键控的单独data.table 是有效的。years和start_pct始终可以合并回来(因为它们完全由sim_num确定)。 -
弗兰克,我不确定你的意思,但很乐意了解更多信息。仅供参考 - 由于时间限制,我最终在 Rcpp 中写了这个,但是了解是否有办法有效地处理这个问题会更好(也许是弗兰克的解决方案!)。
-
您希望它返回多少行?你能展示一个小的前后例子吗?
标签: r dataframe data.table