【问题标题】:populate data frame with file.info using apply function使用 apply 函数用 file.info 填充数据框
【发布时间】:2018-09-26 15:25:29
【问题描述】:

我想使用列表和file.info 函数用文件信息填充现有的空数据框。我一直在使用for 循环执行相同的任务,但想学习如何使用apply 系列并认为这将是一个很好的简单示例。

我的清单...

listOfFiles_M <- c("I:\\temp\\APIS2//APIS01/WAV/APIS01_20170414_150000.wav", "I:\\temp\\APIS2//APIS01/WAV/APIS01_20170414_160000.wav", 
"I:\\temp\\APIS2//APIS01/WAV/APIS01_20170414_170000.wav", "I:\\temp\\APIS2//APIS01/WAV/APIS01_20170414_180000.wav"
)

我的空数据框...

m_files <- structure(list(size = numeric(0), isdir = logical(0), mode = structure(integer(0), class = "octmode"), 
    mtime = structure(numeric(0), class = c("POSIXct", "POSIXt"
    )), ctime = structure(numeric(0), class = c("POSIXct", "POSIXt"
    )), atime = structure(numeric(0), class = c("POSIXct", "POSIXt"
    )), exe = character(0)), .Names = c("size", "isdir", "mode", 
"mtime", "ctime", "atime", "exe"), row.names = character(0), class = "data.frame")

我的功能...

test.info <- function(i,x){
  print (i)
  x[i,]=c(file.info(i))
}

我想我应该这样使用lapply...

lapply(listOfFiles_M, test.info)

这是我希望填充的m_files 看起来像的示例...

m_files <- structure(list(rn = c("I:\\temp\\APIS2//APIS01/WAV/APIS01_20170414_150000.wav", 
"I:\\temp\\APIS2//APIS01/WAV/APIS01_20170414_160000.wav", "I:\\temp\\APIS2//APIS01/WAV/APIS01_20170414_170000.wav", 
"I:\\temp\\APIS2//APIS01/WAV/APIS01_20170414_180000.wav"), size = c(9601276, 
9601276, 9601276, 9601276), isdir = c(FALSE, FALSE, FALSE, FALSE
), mode = structure(c(438L, 438L, 438L, 438L), class = "octmode"), 
    mtime = structure(c(1492200300, 1492203900, 1492207500, 1492211100
    ), class = c("POSIXct", "POSIXt")), ctime = structure(c(1537974713.78911, 
    1537974713.85152, 1537974713.89832, 1537974713.92952), class = c("POSIXct", 
    "POSIXt")), atime = structure(c(1537974713.78911, 1537974713.85152, 
    1537974713.89832, 1537974713.92952), class = c("POSIXct", 
    "POSIXt")), exe = c("no", "no", "no", "no")), .Names = c("rn", 
"size", "isdir", "mode", "mtime", "ctime", "atime", "exe"), row.names = c(NA, 
-4L), class = "data.frame")

编辑:我还应该提到有一个很大的列表,大约 200,000 个项目,所以rbind 可能不是一个好的解决方案。

【问题讨论】:

  • 您的函数需要一个返回值,但在我看来,最好从函数中删除 x 参数,而改为使用 x[] &lt;- lapply(m_files, file.info) 或类似参数。

标签: r apply


【解决方案1】:

只需将您的文件列表传递给file.info,它可以接收多个值作为输入,并根据文档?file.info 返回一个数据框。

final_df <- file.info(listOfFiles_M)

无需初始化空数据框并将值映射到它或rbind迭代返回的对象。

【讨论】:

  • 查看我最近的编辑。我不确定rbind 是否适合我,因为listOfFiles_M 是一个包含 200,000 个文件的列表。
  • 原谅我,你有没有尝试过do.call?这些是单行数据帧。
  • rbind 129,029 个数据帧花了 13.08 分钟。我想我认为会有更快的方法。
  • 您实际上不需要lapplydo.call,因为file.info 可以采用返回单个数据帧的文件的字符向量。见编辑。
  • 很好奇,直接file.info() 调用更快吗?
【解决方案2】:

我假设函数file.info 旨在获取文件名,然后输出一个长度为 7 的向量,用于填充一行。

只是一个建议,当我们至少有 1 个文件没有 file.info 函数的输出时,这有点难以测试。因此,我建议您在发布时简化 m_files 数据框。

我认为唯一的问题是您需要在 lapply 中指定 x 参数。

 lapply(listOfFiles_M, test.info, x = m_files)

apply 中的... 参数用于列出您传递的函数可能需要的其他参数,在本例中为test.info

【讨论】:

    猜你喜欢
    • 2017-12-06
    • 1970-01-01
    • 1970-01-01
    • 2019-08-02
    • 1970-01-01
    • 2018-09-03
    • 2013-05-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多