首页 > 解决方案 > 如何使用 apply 系列函数按分组索引调整列表的值

问题描述

好的,所以我有一个包含各种场景和值的 Excel 表,我想做的是通过使用随机分布来转换其中一些值。我可以一次完成一个场景,但我希望能够以更紧凑的方式完成它,可能使用 apply 函数系列。这是我的矩阵的一个小版本,我将它用作带有 setDT 的 data.table:

matrixfromexcel = 

Scenario char num1 num2 num3 val1 val2 val3

1        1    0    4    8    1.22 2.31 7.33

1        1    0    4    8    1.22 2.31 7.33

1        1    0    4    8    1.22 2.31 7.33

1        1    0    4    8    1.22 2.31 7.33

1        1    0    4    8    1.22 2.31 7.33

1        1    0    4    8    1.22 2.31 7.33

1        1    0    4    8    1.22 2.31 7.33

1        1    0    4    8    1.22 2.31 7.33

2        5    2    0    1    4.2  5.011 12.542

2        5    2    0    1    4.2  5.011 12.542 

2        5    2    0    1    4.2  5.011 12.542 

2        5    2    0    1    4.2  5.011 12.542 

2        5    2    0    1    4.2  5.011 12.542 

2        5    2    0    1    4.2  5.011 12.542 

2        5    2    0    1    4.2  5.011 12.542 

2        5    2    0    1    4.2  5.011 12.542

...

1200    66    8    1    0    555  120 1700

如您所见,场景编号将值分成组,并且场景数量众多,最多可达 1000 多个。这是我用来将正态分布函数中的随机数添加到一种场景的一列的值的方法:

matrixfromexcel[Scenario == 1, val1 := val1+rnorm(8, 1.22, 1)]

其中 8 是不同随机数的数量,1.22 是我希望均值居中的值,1 是我想要的随机数标准差的数量。

因此,如果我想从场景 1 循环到 1000,我应该尝试应用函数还是尝试使用循环?如果应用功能,你能告诉我你的建议吗?谢谢

标签: rmatrixdata.tableapplydistribution

解决方案


您可以利用by参数 in和引用每个组中行数data.table的特殊运算符。.N这里有一些东西可以帮助你开始:

library(data.table)
#> Warning: package 'data.table' was built under R version 3.4.4
dt <- data.table(Scenario = rep(c(1,2,3), times = c(8,5,3)), val1 = rep(c(1.22, 4.2, 6), times = c(8,5,3)))
dt[, new_val := val1 + rnorm(.N, val1, 1), keyby = Scenario]

reprex 包(v0.2.1)于 2019 年 1 月 16 日创建

为了透明度,我创建了new_val与覆盖val1,但您可以根据需要进行修改。另请注意,您当前将 1 传递sdrnorm(). 如果那是您的意图,那就太好了。如果不是,请相应修改。


推荐阅读