【问题标题】:R- how to fix memory issues in R?R-如何解决R中的内存问题?
【发布时间】:2021-12-24 07:55:10
【问题描述】:

老实说,我不太确定问题是什么,但我过去在 R 中遇到过类似的问题。我编写了代码来从 .dat 文件(特别是当前的小组调查)中提取我想要的变量。我有按年份包含每个变量位置的 CSV 文件(位置按年份变化)。例如,2010 年的 HRFS12M1 是 1173-1174,2019 年是 1223-1224(这部分代码没有显示但有效,所以我没有包含它)。所以我有两个文件夹和两个单独的目录,一个是位置,一个是 .dat 文件。我首先遍历职位文件,并为每年(2010-2019 年)创建具有职位的 dfs。生成位置 dfs 后,我运行下面的代码以获取我想要的大型合并 df 中的变量。现在,当我在 varList 中选择 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_cps<-readLines(lst2[i])
  
  #Get the positions of the relevant year
   temp_pos<- 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
  df<-NULL
    for(j in 1:length(varList)){
    df<-cbind(df,substr(temp_cps,temp_pos$Pos1[j],temp_pos$Pos2[j]))
    }
  df<-as.data.frame(df)
  names(df)<-varList
  assign(paste("CPS", i, sep = "."), df)
  
}

 #AutoMate appending each year
for (k in 1:(length(lst2)-1)){
  
  if(k==1){
    CPS1 <- get(paste("CPS", k, sep = "."))
    CPS2 <- get(paste("CPS", k+1, sep = "."))
    #Append to keep only rows of second data set
    merged_data=rbind(CPS1,CPS2)
  }
  else{
    CPS_C <- 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"))
    
  }
}

This is what it looks like before it breaks

This what happens after adding more than 4 variables

【问题讨论】:

  • 变量名是否有重叠(一个是另一个的子字符串)?我只是问,因为如果您有(比如说)名为 ABC 和 ABCD 的列,您的 grep 可能无法按预期工作 - 如果我正确阅读代码,搜索 ABC 将返回两者。你需要像grep(paste('^', varList, '$', sep = '', collapse="|") 这样的东西,只匹配全名
  • 我知道在这里很难描述所有细节,但是如果没有一个独立的例子,很难猜出哪里出了问题。我认为@Hobo 可能走在正确的轨道上。我建议在 for 循环之外逐行运行所有这些,并检查每个对象的结果 - temp_cps / temp_pos 等 - 以确保它在每一步都按预期工作。跨度>
  • 我尝试的所有变量都不是子集,但我可能会添加它以防错。但是例如,如果我将 HRHHID 添加到上面的代码中,它会扭曲值,有时甚至会交换预期行中的值。像今年将去GETFIPS。不知道能不能加个截图展示一下。

标签: r memory memory-management import merge


【解决方案1】:

我想我明白了。需要运行一些额外的变量来确认。但是,如果我的变量列表在位置方面没有按顺序排列,那么该程序目前将无法运行。例如,如果“HRYEAR4”是 82-84,“GESTFIPS”是 93-94,那么如果我在 varList 中将 GETSFIPS 放在 HRYEAR4 之前,程序就会失败。但是,如果 HRYEAR 先出现,那么程序将按预期运行。有谁知道如何快速替换这一行 df

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-10-13
    • 2015-01-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-15
    相关资源
    最近更新 更多