#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")) } }
Комментарии:
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 Если нет, то на данный момент это не имеет большого значения, я просто приведу их в порядок и посмотрю, смогу ли я найти лучшее решение в будущем. Спасибо всем, кто пытался помочь.