在R中添加基于文件名的列字符

时间:2017-03-15 19:47:06

标签: r csv

我有几百个关于按日期代码组织的.pet文件中的信息的文件(19960101格式为YYYYMMDD)。我正在尝试使用日期代码添加一个名为NDate的列:

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

我想要实现的目标,例如01-01-1996 NDate = 19960101,02-01-1996 NDate = 19960102等等。 for循环只是在每次使用最新的pet.atual创意时替换NDate字段吗?感谢

3 个答案:

答案 0 :(得分: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 :(得分:2)

您也可以尝试fread()包中的rbindlist()data.table(由于缺少可重复的示例而未经测试):

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

lapply()&#34;循环&#34;对于每个条目执行files.pet的{​​{1}}中的所有条目,并返回一个包含data.tables fread()的列表,该列表是通过读取每个文件创建的。 fread用于将所有部分组合成一个大型data.table。参数rbindlist()生成一个名为idcol = NDate的索引列,以标识最终输出中每行的来源。 id是列表长度的整数1(如果列表未命名)。

最后,ID号用于查找NDate中的文件名,该文件名使用files.pet包直接转换为类Date
编辑也许,在查找文件名之前,首先将文件名转换为anytime可能更有效:

Date

虽然result[, NDate := anytime::anydate(files.pet)[NDate]] 非常聪明地分析和猜测用于读取文件的正确参数,但是提供其他参数可能是必要的(也可能更快),例如:

fread()

答案 2 :(得分: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))

如果没有可重复的示例,我无法对此进行测试,因此您可能需要稍微玩一下,但一般方法应该有效!