Создание фреймов данных через R For Loop - PullRequest
0 голосов
/ 05 марта 2020

Довольно плохо знаком с R, поэтому любые рекомендации приветствуются.

ЦЕЛЬ: Я пытаюсь создать сотни фреймов данных в коротком сценарии. Они следуют шаблону, поэтому я подумал, что For L oop будет достаточно, но функция data.frame, похоже, игнорирует переменную природу переменной, читая ее в том виде, в котором она появляется. Вот пример:

# Defining some dummy variables for the sake of this example
dfTitles <- c("C2000.AMY", "C2000.ACC", "C2001.AMY", "C2001.ACC") 
Copes <- c("Cope1", "Cope2", "Cope3", "Cope4")
Voxels <- c(1:338)

# (Theoretically) creating a separate dataframe for each of the terms in 'dfTitles'   
for (i in dfTitles){
 i <- data.frame(matrix(0, nrow = 4, ncol = 338, dimnames = list(Copes, Voxels)))
}

# Trying an alternative method
for (i in 1:length(dfTitles))
 {dfTitles[i] <- data.frame(matrix(0, nrow = 4, ncol = 338, dimnames = list(Copes, Voxels)))}

Это приводит к созданию одного фрейма данных с именем 'i' в первом или списка из 4 в случае последнего. Любые идеи? Спасибо!


ВЕРОЯТНО НЕОБХОДИМАЯ ФОНОВАЯ ИНФОРМАЦИЯ: Мы используем данные fMRI для проведения анализа, который проведет корреляции между стимулами, вокселями мозга, областями мозга и участниками. Мы коррелируем целые матрицы, поэтому разделение значений (также называемых COPE) на отдельные кадры данных по идентификатору участника и региону мозга значительно облегчит выполнение следующего шага. Я уже попробовал следующий шаг после загрузки и сортировки данных в один большой фрейм данных, и это была большая боль в заднице.

Ответы [ 2 ]

0 голосов
/ 05 марта 2020
rm(list=ls)
dfTitles <- c("C2000.AMY", "C2000.ACC", "C2001.AMY", "C2001.ACC") 
Copes <- c("Cope1", "Cope2", "Cope3", "Cope4")
Voxels <- c(1:3)

# (Theoretically) creating a separate dataframe for each of the terms in 'dfTitles'   
nr <- length(Voxels)
nc <- length(Copes)
N <- length(dfTitles) # Number of data frames, same as length of dfTitles

DF <- vector(N, mode="list")

for (i in 1:N){
  DF[[i]] <- data.frame(matrix(rnorm(nr*nc), nrow = nr))
  dimnames(DF[[i]]) <- list(Voxels, Copes)
}

names(DF) <- dfTitles
DF[1:2]

$C2000.AMY
       Cope1     Cope2      Cope3      Cope4
1 -0.8293164 -1.813807 -0.3290645 -0.7730110
2 -1.1965588  1.022871 -0.7764960 -0.3056280
3  0.2536782 -0.365232  2.3949076  0.5672671

$C2000.ACC
       Cope1    Cope2      Cope3      Cope4
1 -0.7505513 1.023325 -0.3110537 -1.4298174
2  1.2807725 1.216997  1.0644983  1.6374749
3  1.0047408 1.385460  0.1527678  0.1576037
0 голосов
/ 05 марта 2020

При создании объектов в a для l oop их необходимо сохранить где-то до следующей итерации l oop, иначе они будут перезаписаны.

Один из способов справиться с этим - создать пустой list или вектор с c() перед началом вашего l oop и добавлением выходных данных каждого прогона l oop.

Другой способ справиться с этим - назначить перед тем как перейти к следующей итерации l oop.

# Defining some dummy variables for the sake of this example
dfTitles <- c("C2000.AMY", "C2000.ACC", "C2001.AMY", "C2001.ACC") 
Copes <- c("Cope1", "Cope2", "Cope3", "Cope4")
Voxels <- c(1:338)

# initialize a list to store the data.frame output
df_list <- list()
for (d in dfTitles) {
  # create data.frame with the dfTitle, and 1 row per Copes observation
  df <- data.frame(dfTitle = d,
                   Copes = Copes)
  # append columns for Voxels
  # setting to NA, can be reassigned later as needed
  for (v in Voxels) {
    df[[paste0("Voxel", v)]] <- NA
  }
  # store df in the list as the 'd'th element
  df_list[[d]] <- df
  # or, assign the object to your environment
  # assign(d, df)
}
# data.frames can be referenced by name
names(df_list)
head(df_list$C2000.AMY)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...