【问题标题】:R - Adding filepath to each row of a dataframeR - 将文件路径添加到数据框的每一行
【发布时间】:2019-02-26 14:14:18
【问题描述】:

我对 R 比较陌生,我正在从同一文件夹的不同子文件夹中的许多 .csv 文件中创建一个数据框。到目前为止,我得到了这个:

setwd("~/LMB/Top 6 - 2019/Juegos")

Batting.files  <- list.files(path = "~/LMB/Top 6 - 2019/Juegos/",
recursive = T, pattern=c("(statsHomeBatting.csv|statsVisitorBatting.csv)", 
                                       full.names=T))

setwd("~/LMB/Top 6 - 2019/Juegos/")

Batting.Logs <- do.call(rbind,lapply(Batting.files,read.csv, check.names = FALSE, sep = ";"))

我保存文件的子文件夹如下所示:

~\LMB\Top 6 - 2019\Juegos\Lanús at Ferro Feb 10

我希望在每一列中都有一个变量(我们将其命名为 Batting.Logs$Game,它显示目录的最后一部分(在本例中为 Lanús at Ferro Feb 10

我已经搜索过旧答案,但我无法完成,所以我现在不确定是否可以使用我现有的编码来完成。

提前致谢!

【问题讨论】:

    标签: r dataframe filepath


    【解决方案1】:

    如果你结合这个答案

    https://stackoverflow.com/a/44304004/3438524(对问题:Read multiple csv data and create new columns at one time

    使用 dirname 和 basename(正如 npjc 已发布:https://stackoverflow.com/a/54888162/3438524),这应该可以解决问题。

    Batting.files  <- list.files(path = "~/LMB/Top 6 - 2019/Juegos/",
        recursive = T, pattern=c("(statsHomeBatting.csv|statsVisitorBatting.csv)", 
                                               full.names=T))
    dt.list <- sapply(file.list, fread, simplify=FALSE,data.table=F)
    DT <- rbindlist(dt.list, idcol = 'folder')[, `:=` (folder = basename(dirname(folder)))]
    

    【讨论】:

    • 嗨@user3438524 很抱歉这个基本问题,但我已经阅读了关于rbindlistdirname 的帮助,因为我不熟悉它们,但我遇到了问题最后一行代码,如果将我的目录放在basename(dirname(*folder*)) 中,我会得到以下目前无法使用:= 将列添加到空data.table(无列) 相反,如果我只是离开folder,我会得到:目录名(文件夹)错误:找不到对象“文件夹”感谢您的帮助
    • 嗨@Eliseo Avramides,R 告诉你的是(当你离开文件夹时 - 没有星号)变量文件夹不存在(这是你的新 data.frame 列的名称,其中路径被存储)。您是否将 idcol = 'folder'' 留在了最后一行?尝试使用 str(DT) 来了解对象的结构 (stat.ethz.ch/R-manual/R-devel/library/utils/html/str.html)。您的第一列的名称是什么?
    • 非常感谢!我有点挣扎(不是这么多,只是我在度假)但我最终还是像这样钉住了它dt.list.Batting &lt;- sapply(Batting.files, fread, simplify=FALSE) Batting.by.Game &lt;- rbindlist(dt.list.Batting, idcol = "id")[, :=` (Game = basename(dirname(id)))]`
    【解决方案2】:

    我想你想要?dirname()?basename()

    dirname(path) 返回直到最后一个路径分隔符或“.”的路径部分,但不包括最后一个路径分隔符。如果没有路径分隔符。

    basename(path) 删除所有路径,包括最后一个路径分隔符(如果有)。

    示例:

    具有两个路径的数据框,要获取直接父目录,首先提取目录名称,然后提取结果的基本名称。

    d <- data.frame(path = c('path/to/some/file.csv', 'path/to/another/file.csv'),
                    stringsAsFactors = F)
    
    d$file_dir <- basename(dirname(d$path))
    
    d
    
    #>                       path file_dir
    #> 1    path/to/some/file.csv     some
    #> 2 path/to/another/file.csv  another
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-10-03
      • 2023-02-16
      • 2021-07-07
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多