如何使用 apply 函数族按分组索引调整列表的值

How to use the apply family of functions to adjust values of a list by grouped index

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

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,我应该尝试应用函数还是只尝试使用循环?如果应用功能,你能告诉我你的建议吗?谢谢

您可以利用 data.table 中的 by 参数和特殊运算符 .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 package (v0.2.1)

创建于 2019-01-16

为了透明起见,我创建了 new_val 而不是覆盖 val1,但您可以根据需要进行修改。另请注意,您当前将 1 传递给 rnorm()sd 参数。如果那是你想要的,那就太好了。如果不是,请相应修改。