Как изменить имя переменной с каждой итерацией al oop? - PullRequest
0 голосов
/ 05 марта 2020

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

Цель этого кода - загрузить в каждый файл .csv из папки в свой собственный фрейм данных с соответствующими именами.

#Define the path to the folder containing the data sets
folder <- "Volumes/DataHD/Folder/"

#Make a list of the files within that folder
files <- list.files(path = folder)

#Define the desired names of each dataframe
names <- c("A1", "A2", "A3")

#Set working directory to that folder
setwd(folder)

#Use a for loop to load each .csv file into its own dataframe
i = 1

for(theFile in files){
    name[i] <- read.csv(theFile)
    i = i + 1 
}

Однако вместо создания трех фреймов данных с именами «A1», «A2» и «A3» этот код просто изменяет содержимое списка «имен», чтобы каждый объект в списке был одним из моих желаемых фреймов данных.

Теперь я понимаю, что эти попытки обходного пути были безрассудными sh, но я также попытался:

i = 1

for(theFile in files){
    toString(name[i]) <- read.csv(theFile)
    i = i + 1 
}

, которая выдает ошибку "не удалось найти функцию" toString <- "". И: </p>

i = 1

for(theFile in files){
    c <- toString(name[i]) 
    c <- read.csv(theFile)
    i = i + 1 
}

, который просто превращает c в кадр данных. Исторически, я бы просто сделал что-то вроде:

"A1" <- read.csv("Volumes/DataHD/Folder/LongNameA1.csv"
"A2" <- read.csv("Volumes/DataHD/Folder/LongNameA2.csv"
"A3" <- read.csv("Volumes/DataHD/Folder/LongNameA3.csv"

Но реальный сценарий включает в себя множество наборов данных, и я стараюсь избегать необходимости постоянно перепечатывать или копировать вставки. Есть ли способ сделать sh что я пытаюсь сделать? Или я должен использовать совершенно другой подход и попытаться решить его с помощью массивов?

Редактировать: Каждый нужный фрейм данных имеет разное количество строк, на случай, если это повлияет на ваш совет.

Ответы [ 2 ]

0 голосов
/ 06 марта 2020

Я думаю, что более чистый способ достижения sh был бы ласковым и read.csv

#Define the path to the folder containing the data sets
folder <- "Volumes/DataHD/Folder/"

#Make a list of the files within that folder
files <- list.files(path = folder)

#Define the desired names of each dataframe
names <- c("A1", "A2", "A3")

#Set working directory to that folder
setwd(folder)

# read all files
df_list <- lapply(files, read.csv)

# set the names of your list
names(df_list) <- names

Тогда у вас есть одна глобальная переменная df_list, в которой есть все наши фреймы данных. Это облегчает выполнение дальнейших операций над фреймами данных.

0 голосов
/ 05 марта 2020

Возможно, вы захотите использовать функцию assign() из базы.

for(theFile in files){
  assign(name[i], read.csv(theFile))
  i = i + 1 
}

В качестве альтернативы вы можете использовать lapply() с setNames() для каждого файла, а затем использовать list2env() для установки в своей среде. Это устраняет необходимость в for() l oop и вашем счетчике i.

list2env(lapply(setNames(files, names), 
         read.csv), envir = .GlobalEnv)

Если вы найдете его более читабельным, вы также можете написать это с помощью трубопровода.

setNames(files, names) %>% lapply(., read.csv)  %>% list2env(., envir = .GlobalEnv)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...