2017-03-15 86 views
0

列字符我有一個​​關於在(19960101是YYYYMMDD格式)的日期代碼組織.pet文件的信息,幾百個文件。我想增加一列,NDate與日期代碼:添加基於文件名中的R

for (pet.atual in files.pet) { 
    data.pet.atual <- 
    read.table(file = pet.atual, 
       header = FALSE, 
       sep = ",", 
       quote = "\"",   
       comment.char = ";");  
    data.pet.atual <- cbind(data.pet.atual, NDate= pet.atual) 
} 

我想要實現的,例如,對於1996年1月1日NDate = 19960101,爲02-01- 1996年NDate = 19960102等。不過,for循環每次運行最新的pet.atual,想法時都會替換NDate字段?由於

+1

您應該使用'lapply'而不是for循環來增加一組列。 – Frank

+0

這不僅是the'NDate'場這是在'for'每個循環過程覆蓋,而且'data.pet.atual'。 – Uwe

回答

2

小的修改應該做的伎倆:

data.pet.atual <- NULL 
for (pet.atual in files.pet) { 
    tmp.data <- 
    read.table(file = pet.atual, 
       header = FALSE, 
       sep = ",", 
       quote = "\"",   
       comment.char = ";");  
    tmp.data <- cbind(tmp.data, NDate= pet.atual) 
    data.pet.atual <- rbind(data.pet.atual, tmp.data) 
} 

你也可以更換tmp.data<-cbind(...)通過tmp.data$NDate <- pet.atual

1

是,lapply幫助,弗蘭克建議。你想使用rbind來保持每個文件的日期不同。沿着線的東西:

我假設files.pet是所有要包括的文件的列表...

my.fun<-function(file){ 
data <- read.table(file = file, 
      header = FALSE, 
      sep = ",", 
      quote = "\"",   
      comment.char = ";")  
data$NDate = file 
return(data)} 

data.pet.atual <- do.call(rbind.data.frame, lapply(files.pet, FUN=my.fun)) 

我不能沒有一個重複的例子,測試這一點,所以你可能需要玩一下,但一般的方法應該工作!

2

你也可以嘗試從data.tablefread()rbindlist()(未經測試,由於缺乏一個可重複的例子的):

library(data.table) 
result <- rbindlist(lapply(files.pet, fread), idcol = "NDate") 
result[, NDate := anytime::anydate(files.pet[NDate])] 

lapply()「循環」在所有項目中files.pet執行fread()每個條目,並返回fread從讀取每個文件創建的data.tables列表。 rbindlist()用於將所有塊組合成一個大的data.table。參數idcol = NDate生成名爲NDate以識別在最終輸出的每行的原點索引列。 id是列表長度的整數1(如果列表未被命名)。

最後,id號用於查找files.pet中的文件名,它使用anytime包直接轉換爲類Date
編輯也許,它可能是更有效的第一查找它們之前的文件名Date轉換:

result[, NDate := anytime::anydate(files.pet)[NDate]] 

雖然fread()是分析和猜測正確的參數讀取它可能會在文件很聰明是必要的(也可以更快)以提供附加參數,例如:

result <- rbindlist(lapply(files.pet, fread, header = FALSE, sep = ","), idcol = "NDate")