【问题标题】:Dynamically create a new dataframe column within a list of dataframes在数据框列表中动态创建一个新的数据框列
【发布时间】:2012-11-14 07:31:33
【问题描述】:

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

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

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

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

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

我保存为数据框名称的所有文件名都遵循以下结构:[month]_[year]_[...some other text],例如“August_2012_foo_bar”。所以我想我会使用正则表达式先获取月份,然后再获取年份。我的代码存根是:

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

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

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

感谢您的帮助!

【问题讨论】:

    标签: r list dataframe


    【解决方案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
    }
    

    【讨论】:

    • 完美!非常感谢!我不知道我可以直接将数据框传递给strapply,这就是为什么我尝试使用第二个循环但弄乱了数据框名称!
    猜你喜欢
    • 1970-01-01
    • 2015-04-21
    • 1970-01-01
    • 2021-06-10
    • 2019-03-19
    • 1970-01-01
    • 2021-03-31
    • 1970-01-01
    • 2022-01-03
    相关资源
    最近更新 更多