【问题标题】:Import and rbind multiple csv files with common name in R在 R 中导入和 rbind 多个具有通用名称的 csv 文件
【发布时间】:2013-03-20 15:24:26
【问题描述】:

我有多个名称中包含 4 个常见字符的 CSV 文件。 我想知道如何 rbind 具有相同公共字符的文件。例如,“AM-25”常见于 3 个 csv 文件的名称中,而“BA-35”常见于另一个 2 个文件的名称中。

文件是这样的 AM-25.myfiles.2000.csv、AM-25.myfiles.2001.csv、AM-25.myfiles.2002.csv、BA-35.myfiles.2000.csv、 BA-35.myfiles.2001.csv, 我用它来读取所有文件:

files <- list.files(path=".", pattern="xyz+.csv", all.files = FALSE,full.names=TRUE )

【问题讨论】:

    标签: r dataframe rbind


    【解决方案1】:

    你在寻找这样的东西吗?

    do.call(rbind, lapply(list.files(path=".", pattern="AM-25"), read.table, header=TRUE, sep=","))
    

    这将从包含字符“AM-25”的 csv 文件中读取的矩阵重新绑定在一起。 read.table 的参数可能会有所不同,具体取决于您的 csv 文件。


    编辑

    我希望这适用于您不知道目录中所有可能的文件名的五个字母前缀的情况:

    ##Get all different first five letter strings for all cvs files in directory "."                                                                                                                                                                                           
    file.prefixes <- unique(sapply(list.files(path=".", pattern="*.csv"), substr, 1,5))
    
    ##Group all matching file names according to file.prefixes into a list                                                                                                                                                                                                     
    file.list <- lapply(file.prefixes, function(x)list.files(pattern=paste("^",x,".*.csv",sep=""), path="."))
    names(file.list) <- file.prefixes ##just for convenience                                                                                                                                                                                                                   
    
    ##parse all csv files in file.list, create a list of lists containing all tables for each prefix                                                                                                                                                                           
    tables <- lapply(file.list, function(filenames)lapply(filenames, function(file)read.table(file, header=TRUE)))
    
    ##for each prefix, rbind the tables. Result is a list of length being length(file.prefixes)                                                                                                                                                                                
    ##  each containing a matrix with the combined data parsed from the files that match the prefix                                                                                                                                                                            
    joined.tables <- lapply(tables, function(t)do.call(rbind, t))
    
    ##Save tables to files                                                                                                                                                                                                                                                     
    for (prefix in names(joined.tables))write.table(joined.tables[[prefix]], paste(prefix, ".csv", sep=""))
    

    【讨论】:

    • 谢谢它的工作,但有什么方法可以在“模式”部分的文件名中使用第 5 个字符?我有多个 csv 文件,我无法在“模式”部分提供任何特定术语。
    • 您的意思是不匹配开头包含例如子字符串“AM-25”not 的文件名吗? list.files(path=".", pattern="^AM-25") 将匹配文件 "AM-25.myfiles.2000.csv" "AM-25.myfiles.2001.csv" 和 "AM-25 .myfiles.2002.csv”,但不是文件“otherfile_AM-25.myfiles.2000.csv”。是这个意思吗?
    • 是的,我正在处理几个具有这种格式的 csv 文件,因此我正在寻找方法来 rbind 所有名称中具有共同字符的文件。就像你用“AM-25”建议的那个。但是这些文件太多了,我无法手动提供“模式”参数。
    • 为了更清楚,我需要一些东西来搜索列表中字符串的前 5 个元素并 rbind 匹配的元素。
    • 好的,我想我现在更好地理解了你的问题,我不明白你还不知道常见的字符。我编辑了答案,这对你有用吗?
    猜你喜欢
    • 1970-01-01
    • 2020-06-20
    • 2014-06-03
    • 2023-03-26
    • 1970-01-01
    • 2018-11-22
    • 2021-02-13
    • 2014-07-20
    • 2018-02-15
    相关资源
    最近更新 更多