在数据框列表中动态创建新的数据框列

时间:2012-11-26 19:02:12

标签: r list dataframe

我有一个数据集列表。每个数据集包含一个月的一些数据。数据跨度多年,因此我每年有12个数据集。这个数据最初是一堆Excel文件。我已经导入了this advice之前转换为.csv的所有文件,即:

datalist <- list()
files <- list.files(pattern="\\.csv$")

for(file in files) {
    stem <- gsub("\\.csv$","",file)
    datalist[[stem]] <- read.csv(file)
}

所以我最终得到一个名为datalist的列表,其中包含我的所有数据集。

现在,我的问题是只有文件名包含收集每个数据部分的实际月份和年份,所以我想从每个数据集名称中获取名称和年份,并将它们归入该数据框的两个新列中:“年”和“月”。

我保存为数据框名称的所有文件名都遵循以下结构:[ month ] _ [ year ] _ [ ...其他一些文本],例如“August_2012_foo_bar”。所以我想我会使用正则表达式来抓住当月的第一个月。我的代码存根是:

for(dataset in names(datalists)) {
    name <- dataset
    month <- strapply(name,"^([^_]*).*$")
    ...?
}

正则表达式"^([^_]*).*$"抓住下划线之前的任何内容,即月份。当我需要将抓取的月份分配给数据集的新列时,我会陷入困境。我已经尝试使用assigncbind,但没有运气。

最后,我想将所有这些数据集垂直合并为一个。

感谢您的帮助!

1 个答案:

答案 0 :(得分:1)

您可以引用新列并指定; R将为您创建列。

尝试添加:

datalist[[stem]]$Month <- month
...

这将创建一个名为“Month”的新列,并为其分配month变量。请注意,R将礼貌地重复您分配的变量,以匹配data.frame的现有长度。

所以整个循环看起来像:

for(file in files) {
    stem <- gsub("\\.csv$","",file)
    datalist[[stem]] <- read.csv(file)

    #parse out the month and year here
    ...

    #assign to new columns
    datalist[[stem]]$Month <- month
    datalist[[stem]]$Year <- year
}