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