【问题标题】:Load Filelist into R Dataframe将文件列表加载到 R 数据框中
【发布时间】:2018-08-19 02:45:11
【问题描述】:

我正在处理目录中的所有文件,我想获取文件名的元数据,将其保存在数据框中,然后在处理完目录后最终将数据框加载到 RSQLite 表中。

参考:https://stackoverflow.com/a/51913491/9410024 可能还有https://stackoverflow.com/a/45522323/9410024

我不明白警告消息以及文​​件名未加载到数据框中的原因:

setwd('C://tst//')
df <- data.frame("filename"= character(0), stringsAsFactors=FALSE)
for (fn in Sys.glob("tst*.dat")) {
    print(fn)
    df[nrow(df) + 1,] = list(fn)
}

输出:

[1] "tst1.dat"
[1] "tst2.dat"
[1] "tst3.dat"
Warning messages:
1: In `[<-.data.frame`(`*tmp*`, nrow(df) + 1, , value = list("tst1.dat")) :
  replacement element 1 has 1 row to replace 0 rows
2: In `[<-.data.frame`(`*tmp*`, nrow(df) + 1, , value = list("tst2.dat")) :
  replacement element 1 has 1 row to replace 0 rows
3: In `[<-.data.frame`(`*tmp*`, nrow(df) + 1, , value = list("tst3.dat")) :
  replacement element 1 has 1 row to replace 0 rows
> dfrun
[1] filename
<0 rows> (or 0-length row.names)
>

【问题讨论】:

  • 您需要首先创建一个数据框,其中包含您最终将拥有的行数。您不能以您尝试这样做的方式增长数据框,因此警告您试图用长于零的东西替换空的东西(长度为零)。此外,您使用的代码会做一些非常奇怪的事情——您可能想要&lt;- fn 而不是&lt;- list("fn")
  • 这似乎与第一个参考不一致,我无法知道可能有多少文件。编辑以删除 fn 周围的双引号(剩余的调试代码)。
  • 你会的。首先调用Sys.glob("tst*.dat") 来确定文件的数量,用它来构建空数据框,然后循环它。
  • 原始代码现在可以正常工作 - 不知道发生了什么。

标签: r dataframe filenames


【解决方案1】:

这里不需要增加数据框或使用循环。

假设你有这些文件:

ls ~/tst/*.dat
# tst1.dat tst2.dat tst3.dat

你可以写一个简单的R代码:

library(purrr)
library(dplyr) 

my_files <- Sys.glob(file.path("~", "tst", "*.dat"))
df <- data.frame(filename=my_files, stringsAsFactors = FALSE)

decode_files <- function(x) {
    # some function that processes a file
    lines <- readLines(x)
    substr(lines, 1, 5)
}

df %>% 
    mutate(output = map_chr(filename, decode_files))

这给了你:

                    filename output
1 /Users/pedram/tst/tst1.dat  hfrsh
2 /Users/pedram/tst/tst2.dat  ifhju
3 /Users/pedram/tst/tst3.dat  fdnfd

【讨论】:

  • 循环对于解码文件的第三行和从数据文件中选择两个块的主要任务是必不可少的。为处理的文件捕获元数据是一个辅助过程。我确实想要一种有效的方法来聚合已处理的文件元数据,等待将其加载到 rsqlite 表中。
  • 你也可以避免那里的循环。我更新了我的答案,向您展示如何使用函数式编程和 purrr 来处理向量而不是通过循环。
  • 你说服了我。道路、选项、交通、年份、时期、种子等的元数据将在stackoverflow.com/questions/51903990/… 之前收集在end = 0 中。我需要把它放到 codereview 中。
  • 我不知道你为什么加载这两个库或者生成输出的最后两行是什么意思,但这种方法大大改进了我的代码。
猜你喜欢
  • 2015-06-06
  • 2012-03-20
  • 2012-09-26
  • 2016-01-25
  • 1970-01-01
  • 1970-01-01
  • 2017-11-27
  • 1970-01-01
相关资源
最近更新 更多