基本上,这个想法是让值 n=10,20,30,...100
取 10,000 个随机样本的平均值,保存 10,000 个平均值以供以后使用。
在我更习惯的语言中,我会使用每个 n
作为键,并使用平均值列表作为值来创建一个 HashMap 。
以 JavaScript 为例:
var mydata
var map = {}
for (int i = 10; i <= 100; i += 10 ) {
map[i] = [] // create list
for (int j = 0; j < 10000; j++) {
map[i][j] = mean(sample(mydata, i))
}
}
现在我尝试在 R 中执行此操作(这是我第一次使用它),结果是:
hashmap <- new.env()
sunspots <- read.table("sunspots.txt")
for (i in seq(10, 100, by=10)) {
hashmap[[i]] <- c()
for (j in 1:10000) {
hashmap[[i]][j] <- mean(sample(sunspots$x, i))
}
}
但是这会引发错误:
wrong args for environment subassignment
即使它没有抛出此错误,我也不完全确定我是否以正确的方式处理它。
有人可以帮助我了解解决此问题的正确方法吗?
最佳答案
这里的问题是 i
是一个数字,并且环境必须由字符串作为键控。因此,您眼前的问题可以通过简单的 as.character()
来解决。当用于索引 hashmap
时对 i
变量进行强制转换。
我还建议您将内部循环重构为向量化函数调用,例如 replicate()
。我将这样做:
set.seed(1L);
test.data <- 1:200;
N <- 3L;
e <- new.env();
for (i in seq(10L,100L,10L)) e[[as.character(i)]] <- replicate(N,mean(sample(test.data,i)));
结果:
ls(e);
## [1] "10" "100" "20" "30" "40" "50" "60" "70" "80" "90"
for (i in seq(10L,100L,10L)) print(e[[as.character(i)]]);
## [1] 108.3 109.4 82.4
## [1] 108.50 93.65 106.20
## [1] 103.3333 96.0000 101.2333
## [1] 98.075 95.250 83.275
## [1] 106.68 97.48 107.34
## [1] 97.48333 105.95000 98.76667
## [1] 101.8857 102.4857 114.6000
## [1] 99.5875 107.0875 96.0750
## [1] 92.9000 103.0889 100.7889
## [1] 91.19 99.80 101.57
您可以将 N
更改为 10000,将 test.data
更改为 sunspots
以获取真实数据。
此外,这里还有一个生成矩阵输出的替代方案,它是围绕 sapply()
的便捷功能构建的。它从 FUN()
返回多元素返回值的矩阵:
set.seed(1L);
sapply(seq(10L,100L,10L),function(i) replicate(N,mean(sample(test.data,i))));
## [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10]
## [1,] 108.3 108.50 103.3333 98.075 106.68 97.48333 101.8857 99.5875 92.9000 91.19
## [2,] 109.4 93.65 96.0000 95.250 97.48 105.95000 102.4857 107.0875 103.0889 99.80
## [3,] 82.4 106.20 101.2333 83.275 107.34 98.76667 114.6000 96.0750 100.7889 101.57
关于r - 如何将值列表分配给 R 中的 HashMap ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35445996/