Как я могу создать переменные A1, A2, ..., A100, используя цикл в R? - PullRequest
1 голос
/ 17 апреля 2019

Я пытаюсь создать 1000 переменных, которые я хочу назвать с индексным номером.Я не знаю, как создать эти новые переменные.

for(i in 1:1000) {
  Ui <- rnorm(200,0,1)
}

Ответы [ 3 ]

4 голосов
/ 17 апреля 2019

Это обычная вещь, которую люди хотят делать, особенно когда они приходят из других языков программирования. Тем не менее, есть лучшие способы сделать то же самое, и вы не должны следовать рекомендациям по использованию assign; это плохой совет, о котором вы, вероятно, пожалеете позже.

Способ, которым мы делаем такие вещи в R, заключается в использовании списков , специально именованных списков:

x <- replicate(1000,rnorm(200,0,1),simplify = FALSE)
x <- setNames(x,paste0("A",seq_along(x)))

Теперь x - это именованный список длины 1000, каждый элемент - вектор длины 200 из нормального (0,1) распределения.

Вы можете обращаться к каждому через x[[1]] или x[["A1"]] по мере необходимости. Кроме того, поскольку все они находятся в одном объекте, вы можете легко работать с группой, используя такие инструменты, как lapply.

Практически каждый раз, когда вы обнаруживаете, что хотите создать последовательность объектов с похожими именами, это должно быть сигналом для вас, что вам следует использовать список вместо этого.

3 голосов
/ 17 апреля 2019

Нет смысла загромождать вашу среду таким большим количеством переменных, попробуйте вместо этого сохранить их в именованном списке

l1 <- setNames(lapply(1:5, function(x) rnorm(5)), paste0("A", 1:5))
l1

#$A1
#[1]  0.4951453 -1.4278665  0.5680115  0.3537730 -0.7757363

#$A2
#[1] -0.11096037  0.05958700  0.02578168  1.00591996  0.54852030

#$A3
#[1]  0.1058318  0.6988443 -0.8213525 -0.1072289  0.8757669

#$A4
#[1] -0.6629634  0.8321713 -0.3073465 -0.2645550 -1.0064132

#$A5
#[1]  2.2191246  0.2054360 -0.1768357  1.6875302 -1.1495807

Теперь вы можете получить доступ к отдельному элементу списка как

l1[["A1"]]
#[1] 0.4951453 -1.4278665  0.5680115  0.3537730 -0.7757363

Кроме того, другой метод состоит в том, чтобы сгенерировать все числа вместе, а затем split вывести их в список.

groups = 5
each = 5

setNames(split(rnorm(groups * each), rep(seq_len(groups), each = each)), 
         paste0("A", seq_len(groups)))
1 голос
/ 17 апреля 2019

Я согласен с другими, что это не очень хорошая идея. В любом случае, чтобы ответить на ваш вопрос, как вы это сделаете, это

k <- 1000 # number of variables
n <- 200 # sample size of each variable
for(i in 1:k){
assign(paste0("variable", i), rnorm(n, 0, 1))}
variable1
-0.012947062  0.728284959 -1.627796366  0.003471491 ...

Однако лично я бы предпочел другое решение. Оба ответа пока предлагают использовать списки. Я считаю это слишком громоздким, особенно если вы новичок в R. Поэтому я бы предложил создать матрицу, в которой каждый столбец содержит одну переменную .

# creates a matrix
m <- matrix(rep(NA, n*k), ncol= k)
# generates rnorm() in each column
for(i in 1:k){
m[ , i] <- rnorm(n, 0, 1)
}

# now you can name the columns
colnames(m) <- paste0("variable", 1:k)
m
        variable1   variable2    ...
 [1,]  0.30950749 -2.07388046
 [2,] -1.13232330 -0.55511476
  ...   
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...