用R中的列表替换向量中的元素

时间:2018-09-11 17:01:28

标签: r

因此,我有一个向量points,我想用一对点填充,这些点的x和y坐标均匀地分布在0和1之间。

到目前为止,这是我的代码:

n <- 10000
points <- rep(0, n)
for (i in 1:n) {
  a <- list(x=runif(1, 0, 1), y=runif(1, 0, 1))
  b <- list(x=runif(1, 0, 1), y=runif(1, 0, 1))
  replace(points, i, list(a, b))
}

我也尝试了以下方法:

n <- 10000
points <- rep(0, n)
for (i in 1:n) {
  a <- list(x=runif(1, 0, 1), y=runif(1, 0, 1))
  b <- list(x=runif(1, 0, 1), y=runif(1, 0, 1))
  points[i] <- list(a, b)
}

如您所见,a是x和y均匀分布的第一点,b是x和y均匀分布的第二点。对于i中的每个1:n,我尝试用i替换points中的list(a, b)个元素,但是,我不断收到警告“ “要替换的项目数不是替换长度的倍数”,表明它正在尝试将ipoints作为单独的元素替换a中的第b个元素,而不是将其替换为包含lista的单个b元素。有什么办法可以哄我做我想做的事?

3 个答案:

答案 0 :(得分:1)

尝试使用points <- vector(mode="list",length=n)将点初始化为列表。

编辑:并使用双方括号进行替换(请参见评论)

答案 1 :(得分:0)

函数runif已被向量化,因此,如果您一次调用runif,则代码会更快。本质上,您想要的是获得4 * n个数字,这些数字均匀地分布在0和1之间,因此您只需要numbers <- runif(4 * n)。然后,您可以根据需要构造它们。您实际上是否需要一个列表,或者只是使用它来使for循环更有效?例如matrix(numbers, ncol = 4),将为您提供一个矩阵(您可以将列解释为a的x坐标,a的y坐标,b的x坐标和b的y坐标,但实际上不是很重要,因为它们是独立采样的)。如果您发布带有所需输出的示例,我可以更具体些。

答案 2 :(得分:0)

这应该有效。我将每个点ab定义为一个数据框,因为它更方便。点是点列表

points <- list(a = data.frame(x = runif(10000,0,1),y = runif(10000,0,1)), b =data.frame(x = runif(10000,0,1),y = runif(10000,0,1)))

这里得到10分的结果:

> points
$a
            x         y
1  0.69817192 0.4931020
2  0.08508172 0.5187833
3  0.71519413 0.7871234
4  0.87653502 0.0803383
5  0.57951306 0.4365260
6  0.14673983 0.8060857
7  0.80315435 0.2124616
8  0.79790622 0.6328104
9  0.22130415 0.6239957
10 0.99642466 0.2076050

$b
           x           y
1  0.3798732 0.419808119
2  0.5833667 0.002143209
3  0.8335923 0.708020370
4  0.1923296 0.322810176
5  0.9421873 0.190519505
6  0.6633320 0.143258369
7  0.7465269 0.071942890
8  0.6919004 0.627667826
9  0.5362267 0.345617737
10 0.1725097 0.476865279