R: Проблемы с добавлением фреймов данных в список в цикле

#r

#r

Вопрос:

Я просто слишком долго возился с этим, но я не могу понять, что я делаю неправильно. Может кто-нибудь, пожалуйста, дать мне подсказку?

У меня есть список имен файлов. Эти имена присваиваются функции, которая должна открывать файлы (spss-файлы) и возвращать список фреймов данных.

 list_of_df <- list()

does_something <- function(...)
  items = list(...)
  
  for (item in items){
    # open spss-file as data.frame
    # ...
    df <- data.frame(var1 = "test")
    
    # put dataframe in 'list_of_df'
    list_of_df <- append(list_of_df, df)
  }
  return(list_of_df)
}



filenames <- c("file1.sav", "file2.sav", "file3.sav")

for(filename in filenames){
  df_output <- does_something(filename) 
}

df_output # Should be a list with three data.frames

 

Заранее спасибо!

Комментарии:

1. Две вещи: во-первых, вам не нужны два отдельных цикла, вы могли бы упростить все это до одного; во-вторых, если вы вместо этого используете lapply вместо первого цикла и функция возвращает a data.frame , то результатом будет список data.frames . Вы просили только подсказку, но я могу дать более подробную информацию, если хотите!

2. да, пожалуйста. Я всегда заинтересован в улучшении своего кода.

3. Вторая часть приведенного ниже ответа отражает то, на что я намекал 🙂

Ответ №1:

Несколько небольших правок, которые, надеюсь, укажут вам правильное направление:

 library(haven) # for loading .sav files

loadSPSSFiles <- function(fileNames){
  
  # Initialise a list to store the dataframes
  items <- list()
  
  # Load each file and store
  for(fileName in fileNames){
    items[[fileName]] <- read_sav(fileName)
  }
  
  return(items)
}

fileNames <- c("file1.sav", "file2.sav", "file3.sav")

spssData <- loadSPSSFiles(fileNames)
 

Редактирование, отражающее комментарий @RaphaelS выше об использовании lapply :

 library(haven) # for loading .sav files

fileNames <- c("file1.sav", "file2.sav", "file3.sav")

spssData <- lapply(fileNames, FUN=read_sav)