r - 如何使用 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,我应该尝试应用函数还是尝试使用循环?如果应用功能,你能告诉我你的建议吗?谢谢
解决方案
您可以利用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 传递sd
给rnorm()
. 如果那是您的意图,那就太好了。如果不是,请相应修改。
推荐阅读
- flask - 如何在 Python、Python-chess 和 Flask 中为我自己的国际象棋网站创建类似 Lichess 的引擎到玩家通信 API?
- java - “String 无法转换为 int”红线错误
- amazon-web-services - 集群无法访问 ECS 服务
- java - 如何去除java程序的垃圾回收时间?
- postgresql - 如何在具有长格式时间戳的列上以日期作为输入运行 postgres 查询
- java - 如何使drools文件中的全局变量同步?
- firebase - 从 Xcode 11 更新到 12 后的 App Delegate/Scene Delegate 和 Firebase 问题
- c# - 来自 Html Agility Pack 的 LoadFromWebAsync 的异步 NullRefrenceException
- csv - 处理 CSV 文件中包含逗号的数据
- c++ - 可以用内部链接修改 const ......在外部?