Динамическое имя кадра данных R в цикле For

Я использую цикл For для создания 100 наборов данных в соответствии с некоторыми спецификациями. Моя конечная цель - иметь 1 набор данных, содержащий каждый повторяемый набор данных (т.е. набор данных с 1 по 100).

Мое нынешнее решение неэлегантно. Я экспортирую каждый отдельный фрейм данных (называемый набором данных) в CSV, а затем объединяю их за пределами R. С каждой итерацией i цикла For мой фрейм данных перезаписывается.

Trackfile=1:100
for (i in Trackfile){
  d.cor <- .10 # Desired correlation
  Dataset <- as.data.frame(mvrnorm(20, mu = c(0,0), 
                                   Sigma = matrix(c(1,d.cor,d.cor,1), ncol = 2), 
                                   empirical = TRUE))
  write.csv(Dataset, paste0("C:/",d.cor," ",i,".csv"))
}

Я считаю, что решение состоит в том, чтобы динамически назвать фрейм данных в соответствии с итерацией (i), чтобы фреймы данных назывались dataset1, dataset2 ... dataset100, а затем объединить их. Но я изо всех сил пытался найти решение для динамического именования фреймов данных, встроенных в цикл For. Я новичок в R, помогите пожалуйста!


person Pusheenicorn    schedule 09.03.2018    source источник
comment
Я считаю, что решение состоит в том, чтобы динамически называть фрейм данных: Нет! Пожалуйста, не надо! Инициализируйте пустой список длиной 100 и поместите каждый набор данных в список по очереди. Затем их можно объединить в один объект прямо в R. Как вы это сделаете, зависит от того, что вы подразумеваете под слиянием.   -  person joran    schedule 09.03.2018
comment
Почему бы вам не создать фрейм данных и продолжать добавлять в него строки из цикла for. В качестве альтернативы вы можете создать список / массив / вектор фреймов данных.   -  person rnso    schedule 09.03.2018


Ответы (2)


R легко справляется с этим. Это подход, но он может потребовать модификации в зависимости от того, что вы хотите делать со всеми этими случайными наборами данных. Это создает список из 100 матриц, помеченных от «data001» до «data100»:

library(MASS)
d.cor <- .10
DATA <- replicate(100,  mvrnorm(n=20, mu=c(0, 0), Sigma=matrix(c(1,
     d.cor, d.cor, 1), ncol=2), empirical=TRUE), simplify=FALSE)
names <- paste0("data", sprintf("%0003d", 1:100))
names(DATA) <- names
head(DATA[["data099"]])
#              [,1]         [,2]
#  [1,]  1.94086111  1.570299681
#  [2,] -0.74071651 -0.664948968
#  [3,] -1.02952487 -0.704650191
#  [4,]  0.85203916  0.698703243
#  [5,] -0.08673212  1.668412324
#  [6,]  0.88828524  0.001039757
save(DATA, file="AllData.RData")

Этот код создает список, содержащий 100 матриц, и называет каждую матрицу. Вы можете получить доступ к конкретной матрице с именем или номером, DATA[["data099")]] или DATA[[99]]. Он сохраняется как «AllData.RData», чтобы вы могли получить его с помощью load("AllData.RData"). В зависимости от того, что вы планируете делать с этими данными, список, вероятно, будет более гибким, чем 100 отдельных файлов.

person dcarlson    schedule 09.03.2018
comment
Это сработало, dcarlson, я очень признателен, спасибо! :) И спасибо joran и rnso за комментарии. rnso, вы указали мне правильное направление, и я считаю, что у меня есть альтернативное решение, опубликованное ниже. Всем привет! - person Pusheenicorn; 09.03.2018

Спасибо rnso за то, что указал мне на альтернативное решение:

trial=NULL
Trackfile=1:10
for (i in Trackfile){
  d.cor <- .10 # Desired correlation
  Dataset <- as.data.frame(mvrnorm(20, mu = c(0,0), 
                                   Sigma = matrix(c(1,d.cor,d.cor,1), ncol = 2), 
                                   empirical = TRUE))
  trial = rbind(trial, data.frame(Dataset$V1, Dataset$V2))
}
print(trial)
print(Dataset)

Спасибо сообществу stackoverflow. Я очень ценю это.

person Pusheenicorn    schedule 09.03.2018