2017-03-15 88 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")