R:使用周期函数创建data.table

时间:2015-03-05 19:58:52

标签: r function dataframe data.table tidyr

我想以tidy形式创建一个data.table,其中包含articleID,period和demand(以articleID和句点为键)列。需求受随机函数的影响,输入数据来自另一个data.frame(params)。它是在运行时为不同的周期数创建的。

以“非整洁”的形式很容易做到这一点:

#example data
params <- data.frame(shape=runif(10),   rate=runif(10)*2)
rownames(params) <- letters[1:10]
periods <- 10

# create non-tidy data with one column for each period
df <- replicate(nrow(params), 
                   rgamma(periods,shape=params[,"shape"], rate=params[,"rate"]))
rownames(df) <- rownames(params)

这种创作是否有“整洁”的方式?我需要复制rgamma(),但我不知道如何使它使用相应文章的参数。我尝试从data.table开始使用交叉连接:

dt <- CJ(articleID=rownames(params), per=1:periods, demand=0)

但我不知道如何在创建时直接正确地将rgamma传递给dt [,demand],也不知道如何在不使用一些丑陋的for循环的情况下更改值。我还考虑过使用tidyr包中的gather(),但据我所知,我还需要使用for循环。

对于我目前的用例,我是否使用data.frame或data.table并不重要。任何(或两者!)的解决方案都将受到高度赞赏。

1 个答案:

答案 0 :(得分:1)

这样做(请注意,它假设params按行名排序,如果不是,您可以将其转换为data.table并合并两者):

CJ(articleID=rownames(params), per=1:periods)[,
  demand := rgamma(.N, shape=params[,"shape"], rate=params[,"rate"]), by = per]