R — как исправить проблемы с памятью в R?

#r #memory #memory-management #import #merge

Вопрос:

Честно говоря, я не совсем уверен, в чем проблема, но в прошлом у меня была аналогичная проблема в R. Я написал код для извлечения нужных мне переменных из файлов .dat (в частности, текущего панельного опроса). У меня есть CSV-файлы, которые содержат позиции каждой переменной по годам (позиции меняются по годам). Например, HRFS12M1 в 2010 году составляет 1173-1174, а в 2019 году 1223-1224 (и эта часть кода не показана, но работает, поэтому я ее не включал). Итак, у меня есть две папки и два отдельных каталога, один с позициями, а другой с файлами .dat. Сначала я просматриваю файлы позиций и создаю dfs с позициями на каждый год (2010-2019). После создания dfs позиции я запускаю приведенный ниже код, чтобы получить нужные мне переменные в большом объединенном df. Теперь код работает так, как задумывалось, когда я выбираю 4 или менее переменных в списке переменных. Однако в тот момент, когда я пытаюсь использовать больше переменных, df начинает выдавать значения, которых нет в этих столбцах. Кто-нибудь знает, почему он это делает? Я попробовал несколько разных переменных, чтобы подтвердить, что проблема не в файлах позиций, а в количестве переменных.

 #Loop through list of .dat files (lst2 contains name of files example:2010dec.dat) for(i in 1:length(lst2)){    #Import the data cps data set  temp_cpslt;-readLines(lst2[i])    #Get the positions of the relevant year  temp_poslt;- get(paste("Year", i, sep = "."))    #List of Variables we are looking at (can't use more than 4)  **varList=c("HRYEAR4","GESTFIPS","HESP1","HRFS12M1")**    #Get positions only for the variables selected  temp_pos=temp_pos[grep(paste(varList, collapse="|"), temp_pos$Variable),]    #Create the dataframe  dflt;-NULL  for(j in 1:length(varList)){  dflt;-cbind(df,substr(temp_cps,temp_pos$Pos1[j],temp_pos$Pos2[j]))  }  dflt;-as.data.frame(df)  names(df)lt;-varList  assign(paste("CPS", i, sep = "."), df)   }   #AutoMate appending each year for (k in 1:(length(lst2)-1)){    if(k==1){  CPS1 lt;- get(paste("CPS", k, sep = "."))  CPS2 lt;- get(paste("CPS", k 1, sep = "."))  #Append to keep only rows of second data set  merged_data=rbind(CPS1,CPS2)  }  else{  CPS_C lt;- get(paste("CPS", k 1, sep = "."))  merged_data=merged_data=rbind(merged_data,CPS_C)  }  if(k==length(lst2)-1){    #Clear Console  rm(list=setdiff(ls(), "merged_data"))    } }  

Вот как это выглядит до того, как сломается

Это то, что происходит после добавления более 4 переменных

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

1. Есть ли совпадение в именах ваших переменных (является ли одно подстрокой другого)? Я спрашиваю только потому, что ваш grep может работать не так, как ожидалось, если бы у вас были (скажем) вызываемые столбцы ABC и ABCD — поиск ABC вернул бы оба, если бы я правильно прочитал код. Вместо этого вам понадобится что-то вроде grep(paste('^', varList, '$', sep = '', collapse="|") , чтобы совпадали только полные имена

2. Я знаю, что здесь трудно представить все детали, но без самодостаточного примера, который ломается, будет действительно трудно догадаться, что происходит не так. Я думаю, что @Hobo потенциально может быть на правильном пути. Я бы предложил запустить все это построчно вне for цикла и проверить результаты каждого объекта- temp_cps / temp_pos и т. Д.-Чтобы убедиться, что он работает должным образом на каждом шаге.

3. Ни одна из переменных, которые я пробовал, не являются подмножествами, но я мог бы добавить это в любом случае для защиты от ошибок. Но, например, если я добавлю HRHHID в приведенный выше код, это приведет к искажению значений, а иногда даже к замене значений в их предполагаемых строках. Как будто год уйдет на GETFIPS. Я не знаю, могу ли я добавить скриншот, чтобы показать это.

Ответ №1:

Кажется, я все понял. Нужно запустить несколько дополнительных переменных для подтверждения. Но в настоящее время программа не будет работать, если мой список переменных не в порядке с точки зрения позиции. Например, если «HRYEAR4» равен 82-84, а «GESTFIPS» — 93-94, то программа завершится неудачей, если я помещу GETSFIPS перед HRYEAR4 в varList. Однако, если на первом месте будет HRYEAR, то программа будет работать по назначению. У кого-нибудь есть какие-нибудь быстрые идеи о том, как заменить эту строку df Если нет, то на данный момент это не имеет большого значения, я просто приведу их в порядок и посмотрю, смогу ли я найти лучшее решение в будущем. Спасибо всем, кто пытался помочь.