【问题标题】:I have a list of data frames I would like to name individually by its own name.using the names function我有一个数据框列表,我想用自己的名字单独命名。使用 names 函数
【发布时间】:2021-02-26 21:09:03
【问题描述】:

我能够从文件夹中提取文件并拥有一个列表

#Set work directory
directory<-paste0("C://Program//User//Me//")

filestoread <- list.files(directory, pattern = "^LName_WWWF.*\\.xlsx$", full.names = TRUE)


filelist = lapply(filestoread, function(x){as.data.frame(read_excel(x,sheet = 
                                                          "Sheet1"))})

文件名如下所示

"LName_WWWFRecvd2016_dated_20200204", "LName_WWWFRecvd2017_dated_20200204" , "LName_WWWFRecvd2018_dated_20200204", 
"LName_WWWFRecvd2019_dated_20200204","LName_WWWFRecvd2020_dated_20200204"

我想更改它们,以便 names(filelist) 函数将文件重命名为

"WWWF2016", "WWWF2017" , "WWWF2018", 
"WWWF2019","WWWF2020"

我在想一些简单的事情,比如删除第一个下划线之前的所有内容,然后保持连接左 4 和右 4 之后的所有内容。如果你有更好的主意,那也很好。

【问题讨论】:

    标签: r list dataframe


    【解决方案1】:

    使用sub,我们可以将子字符串捕获为一个块,并在replacement中指定捕获组的反向引用

    names(filelist) <- sub("^[^_]+_([A-Z]+)R[a-z]+(\\d+)_.*",
           "\\1\\2", basename(filenm))
    
    names(filelist)
    #[1] "WWWF2016" "WWWF2017" "WWWF2018" "WWWF2019" "WWWF2020"
    

    -模式匹配的细节

    `^` - start of the string
    `[^_]+` - one or more characters not an underscore
    `_` - followed by underscore
    `([A-Z]+)` - capture one or more upper case letters
    `R` - followed by letter R
    `[a-z]+` - one or more lower case letters
    `(\\d+)` - capture one or more digits
    `_.*` - followed by underscore and rest of the characters
    

    替换

    `\\1`-  backreference for first captured group
    `\\2` - backreference for second captured group
    

    数据

    filenm <- c("LName_WWWFRecvd2016_dated_20200204",    
         "LName_WWWFRecvd2017_dated_20200204", 
        "LName_WWWFRecvd2018_dated_20200204",       
        "LName_WWWFRecvd2019_dated_20200204", 
        "LName_WWWFRecvd2020_dated_20200204")
    

    【讨论】:

    • 你知道为什么我的文件会在整个文件路径中被读取吗?我的结果最终是 C://Program//User//Me//LName_WWWFRecvd2017_dated_20200204。我要剪切字符串名称目录吗?
    • @user35131 我以为你已经剥离了路径。您可以使用basename(filenm)。试试更新的代码
    • 第一次看到它是如何完成的。谢谢你。一切都很完美。非常感谢!
    【解决方案2】:

    希望下面的代码对你有用(感谢@akrun 的数据)

    > sub(".*_(\\w{4})\\w+(\\d{4})_.*", "\\1\\2", filenm)
    [1] "WWWF2016" "WWWF2017" "WWWF2018" "WWWF2019" "WWWF2020"
    

    【讨论】:

      猜你喜欢
      • 2021-12-08
      • 1970-01-01
      • 2020-09-26
      • 2022-10-13
      • 1970-01-01
      • 2020-09-11
      • 1970-01-01
      • 2022-09-22
      相关资源
      最近更新 更多