簡體   English   中英

R中for循環的更快替代方法,后者使用另一個循環調用函數

[英]Faster alternative to for loop in R which calls a function with another loop

我正在嘗試將巨大的數據集解析為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)

其中varIn和varEnd跟蹤拆分點。 創建的函數為。

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)
}

然后為了遍歷所有可用數據,我創建了一個for循環。

df<-data.frame(matrix(ncol=length(varName)))
names(df)<-as.character(varName)

for (i in 1:length(data)){
  df<-rbind(df,parseLine(data[i]))
}

但是,當我通過1,000次迭代檢查功能時,系統時間為10.82秒,但是當我將其增加到10,000而不是108.2秒的時間時,系統時間為614.77,這表明隨着迭代次數的增加所需時間將成倍增加。

有什么建議可以加快流程嗎? 我嘗試過使用庫foreach,但是沒有像我期望的那樣使用並行。

m<-foreach(i=1:10,.combine=rbind) %dopar% parseLine(data[i])
df<-a
names(df)<-as.character(varName)

為什么要重新發明輪子? 在utils軟件包中使用read.fwf(默認情況下為附件)

> 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

如果您指定colClasses,您應該會進一步提高效率,但是我為證明這一點所做的努力沒有顯示出任何區別。 也許該建議僅適用於read.table和表兄弟。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM