Как подмножество в цикле for с использованием списков

#r #subset

#r #подмножество

Вопрос:

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

В принципе, мне нужно подмножить часть всех моих (очень больших) файлов .csv. Мне нужны столбцы 102: 110 (все 1278 строк). Я читаю во всех файлах .csv в список (PsychoPy). Я хочу создать новый список со всеми новыми подмножествами файлов .csv (PsychoPy2). Я попробовал следующее:

 PsychoPy2 <- list()
for(i in 1:31){
  PsychoPy2[[i]] <- (PsychoPy[[i]][,102:110])
}
 

Я продолжаю получать следующую ошибку: Error in `[.data.frame`(PsychoPy[[i]], 1:1278, 102:110) : undefined columns selected

Я пробовал, но файлы слишком велики для загрузки сюда.

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

1. Можете ли вы опубликовать более существенный объем своего кода, возможно, весь цикл for? Вы также можете попытаться представить воспроизводимый пример, который возвращает ту же ошибку, возможно, с имитированными данными

Ответ №1:

Привет, коллега-психофизик!

Прежде чем опубликовать свой первоначальный ответ, я подумал, могут ли круглые скобки в вашем цикле for вызывать проблему. Похоже, это работает, когда я его тестирую (если я понял вашу конструкцию списка PsychoPy):

 for(i in 1:31){
  PsychoPy2[[i]] <- PsychoPy[[i]][,102:110]
}
 

В противном случае моей первой мыслью был другой подход:

Если я правильно понимаю / делаю вывод из вашего примера, у вас есть 31 CSV-файл, из которого вы хотите создать список из 31 объекта, каждый из которых соответствует [,102: 110] таблицы из каждого файла.

Для этого я бы использовал цикл при чтении в каждом файле для чтения файла данных, копирования нужных ячеек в пустой список и повторения. Есть ли причина, по которой этого не делать? (У меня нет большого опыта работы с очень большими файлами .csv, поэтому мне интересно, может ли 31 вызов read.csv() для них быть чрезмерно длинным / длинным) Я бы сам попробовал следующее:

 CSVlocation='C:/YourDataFolder' #file path to folder containing your csv files
filelist=list.files(path=CSVlocation, pattern='*.csv') #list names of your CSV files

PsychoPy2=list() #Create an empty list to add to
for(i in 1:31){ 
  
  filepath=file.path(CSVlocation, filelist[i]) #create file path to load
  data<-read.csv(filepath) #load the csv file into 
  
  PsychoPy2[[i]]<-data[,102:110]
  }
 

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

Ответ №2:

Ваш код цикла выглядит хорошо (я тестировал с некоторыми примерами данных), хотя вы можете легко достичь ожидаемого результата PsychoPy2 <- lapply(PsychoPy, "[", 102:110) .

Я полагаю, что в некоторых ваших csv-файлах нет столбцов от 102 до 110. Пожалуйста, проверьте это с помощью:

 target_dir <- "directory_with_csv_files"
files <- list.files(target_dir, "csv$", full.names = T)
ncol_files <- sapply(files, function(file) ncol(read.csv(file)))
 

Это вернет количество столбцов в файле csv. Уилл может дополнительно проверить all(ncol_files >= 110) , возвращает ли TRUE он. Если нет, то вы должны проверить, в ncol_files каком из них меньше столбцов.