Заменить элемент в векторе списком в R - PullRequest
0 голосов
/ 11 сентября 2018

Итак, у меня есть вектор, 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), однако я продолжаю получать предупреждение "количество заменяемых элементов не кратно замещающая длина ", указывающая, что он пытается заменить i -й элемент в points на a и b как отдельные элементы, а не заменяет его одним list элементом, содержащим a и b. Можно ли как-нибудь уговорить его сделать то, что я хочу?

Ответы [ 3 ]

0 голосов
/ 11 сентября 2018

Функция runif уже векторизована, поэтому ваш код будет намного быстрее, если вы вызовете runif один раз. По сути, вы хотите получить 4 * n числа, которые равномерно распределены между 0 и 1, поэтому все, что вам нужно, это numbers <- runif(4 * n). Затем вы можете структурировать их по мере необходимости. Вам действительно нужен список или вы просто используете его, чтобы сделать цикл for более эффективным? Например, matrix(numbers, ncol = 4), даст вам матрицу (вы можете интерпретировать столбцы как координату x для a, координату y для a, координату x для b и координату y для b, на самом деле это не имеет значения как они выбираются независимо). Я могу быть более конкретным, если вы опубликуете пример с желаемым результатом.

0 голосов
/ 11 сентября 2018

Это должно работать. Я определил каждую точку a и b как фрейм данных, так как это более удобно. точка - это список точек

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
0 голосов
/ 11 сентября 2018

Попробуйте создать точки в виде списка, используя points <- vector(mode="list",length=n).

Редактировать: И использовать двойные квадратные скобки для замены (см. Комментарий)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...