R中for循环调用另一个循环函数的更快替代方法

R中for循环调用另一个循环函数的更快替代方法,r,performance,parsing,for-loop,foreach,R,Performance,Parsing,For Loop,Foreach,我试图将一个巨大的数据集解析为R(1.3Gb)。原始数据是一个由400万个字符组成的列表,每个字符都是137个变量的观察值 首先,我创建了一个函数,该函数根据数据集中提供的键分隔字符,其中“d”是每个字符。为了这个问题的目的,假设d有这种形式 “2005400d” 关键是 varName <- c("YEAR","AGE","GENDER","STATUS") varIn <- c(1,5,7,8) varEND <- c(4,6,7,8) varName为什么要重新发

我试图将一个巨大的数据集解析为R(1.3Gb)。原始数据是一个由400万个字符组成的列表,每个字符都是137个变量的观察值

首先,我创建了一个函数,该函数根据数据集中提供的键分隔字符,其中“d”是每个字符。为了这个问题的目的,假设d有这种形式

“2005400d”

关键是

varName <- c("YEAR","AGE","GENDER","STATUS")
varIn   <- c(1,5,7,8)
varEND  <- c(4,6,7,8)

varName为什么要重新发明轮子?在utils包中使用read.fwf(默认情况下附加)

>dat varName varn varEND read.fwf(textConnection(dat),col.names=varName,widths=1+varEND varn)
年龄性别地位
2005年1月40日

如果您指定colclass,您应该会获得更高的效率,但我演示这一点的努力没有显示出差异。也许这个建议只适用于阅读表和表兄弟姐妹。

为什么要重新发明轮子?在utils包中使用read.fwf(默认情况下附加)

>dat varName varn varEND read.fwf(textConnection(dat),col.names=varName,widths=1+varEND varn)
年龄性别地位
2005年1月40日

如果您指定colclass,您应该会获得更高的效率,但我演示这一点的努力没有显示出差异。也许这个建议只适用于阅读表和表兄弟姐妹。

为什么要重新发明轮子?在utils包中使用read.fwf(默认情况下附加)

>dat varName varn varEND read.fwf(textConnection(dat),col.names=varName,widths=1+varEND varn)
年龄性别地位
2005年1月40日

如果您指定colclass,您应该会获得更高的效率,但我演示这一点的努力没有显示出差异。也许这个建议只适用于阅读表和表兄弟姐妹。

为什么要重新发明轮子?在utils包中使用read.fwf(默认情况下附加)

>dat varName varn varEND read.fwf(textConnection(dat),col.names=varName,widths=1+varEND varn)
年龄性别地位
2005年1月40日

如果您指定colclass,您应该会获得更高的效率,但我演示这一点的努力没有显示出差异。也许这个建议只适用于
read.table
和堂兄弟姐妹。

在您的第一个循环中,您是否正在执行
子字符串(“2005400d”,varIn,varEND)
?如果不是,您似乎可以使用类似的方法(速度也更快)将原始数据格式化为固定宽度?然后可能是相关的。不要保持对数据帧的
rbind
ing;创建单个数据帧的列表,然后
do.call(rbind,ListOfDataFrames)
在第一个循环中,您是否正在执行
子字符串(“2005400d”,varIn,varEND)
?如果不是,您似乎可以使用类似的方法(速度也更快)将原始数据格式化为固定宽度?然后可能是相关的。不要保持对数据帧的
rbind
ing;创建单个数据帧的列表,然后
do.call(rbind,ListOfDataFrames)
在第一个循环中,您是否正在执行
子字符串(“2005400d”,varIn,varEND)
?如果不是,您似乎可以使用类似的方法(速度也更快)将原始数据格式化为固定宽度?然后可能是相关的。不要保持对数据帧的
rbind
ing;创建单个数据帧的列表,然后
do.call(rbind,ListOfDataFrames)
在第一个循环中,您是否正在执行
子字符串(“2005400d”,varIn,varEND)
?如果不是,您似乎可以使用类似的方法(速度也更快)将原始数据格式化为固定宽度?然后可能是相关的。不要保持对数据帧的
rbind
ing;创建单个数据帧的列表,然后
do.call(rbind,ListOfDataFrames)
我太笨了。。。非常感谢,我不知道read.fwf函数。。。真的谢谢!!我真傻。。。非常感谢,我不知道read.fwf函数。。。真的谢谢!!我真傻。。。非常感谢,我不知道read.fwf函数。。。真的谢谢!!我真傻。。。非常感谢,我不知道read.fwf函数。。。真的谢谢!!
parseLine<-function(d){
  k<-unlist(strsplit(d,""))
  vec<-rep(NA,length(varName))
  for (i in 1:length(varName)){
    vec[i]<-paste(k[varIn[i]:varEnd[i]],sep="",collapse="")
  }
  return(vec)
}
df<-data.frame(matrix(ncol=length(varName)))
names(df)<-as.character(varName)

for (i in 1:length(data)){
  df<-rbind(df,parseLine(data[i]))
}
m<-foreach(i=1:10,.combine=rbind) %dopar% parseLine(data[i])
df<-a
names(df)<-as.character(varName)
> dat <- "2005400d"
> varName <- c("YEAR","AGE","GENDER","STATUS")
> varIn   <- c(1,5,7,8)
> varEND  <- c(4,6,7,8)
> read.fwf(textConnection(dat), col.names=varName, widths=1+varEND-varIn)
  YEAR AGE GENDER STATUS
1 2005  40      0      d