r - 使用 rbind() 在 lapply() 中将多个数据帧组合成一个更大的 data.frame

标签 r dataframe lapply read.table rbind

我正在使用 R-Studio 0.99.491 和 R 版本 3.2.3 (2015-12-10)。我是 R 的相对新手,希望得到一些帮助。我正在做一个项目,我试图使用旧媒体服务器上的服务器日志来识别服务器中的哪些文件夹/文件仍在访问中,哪些不在,以便我的团队知道要迁移哪些文件。每个日志都有 24 小时的时间段,我有大约一年的日志,所以理论上,我应该能够看到过去一年的所有访问。

我的理想输出是获得一个树状结构或图,它将向我显示我们服务器上正在使用的文件夹。我已经想出了如何将一个日志(一天)作为 data.frame 读入 R 中,然后使用 R 中的 data.tree 包将其变成一棵树。现在,我想在创建树之前递归地遍历目录中的所有文件,将它们一个一个地添加到原始 data.frame 中。这是我当前的代码:

#Create the list of log files in the folder
files <- list.files(pattern = "*.log", full.names = TRUE, recursive = FALSE)
#Create a new data.frame to hold the aggregated log data
uridata <- data.frame()
#My function to go through each file, one by one, and add it to the 'uridata' df, above
lapply(files, function(x){
    uriraw <- read.table(x, skip = 3, header = TRUE, stringsAsFactors = FALSE)
    #print(nrow(uriraw)
    uridata <- rbind(uridata, uriraw)
    #print(nrow(uridata))
})

问题是,无论我尝试什么,lapply 循环中 'uridata' 的值似乎没有在 lapply 循环之外保存/传递,而是在每次循环运行时以某种方式被覆盖。所以我没有得到一个大的data.frame,而是得到最后一个'uriraw'文件的内容。 (这就是为什么在循环中有这两个带注释的打印命令的原因;每次循环运行时,我都在测试数据框中有多少行。)

谁能澄清我做错了什么?同样,我希望最后有一个大的 data.frame,它结合了文件夹中每个(目前有七个)日志文件的内容。

最佳答案

do.call()是你的 friend 。

big.list.of.data.frames <- lapply(files, function(x){
    read.table(x, skip = 3, header = TRUE, stringsAsFactors = FALSE)
})

或更简洁(但不太容易修补):
big.list.of.data.frames <- lapply(files, read.table, 
                                  skip = 3,header = TRUE,
                                  stringsAsFactors = FALSE)

然后:
big.data.frame <- do.call(rbind,big.list.of.data.frames)

这是一种推荐的做事方式,因为在 R 中动态“增长”数据框是痛苦的。缓慢且占用内存,因为每次迭代都会构建一个新框架。

关于r - 使用 rbind() 在 lapply() 中将多个数据帧组合成一个更大的 data.frame,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36902815/

相关文章:

python - Pandas :嵌套数据框

r - 如何通过 R 访问 HDFS?

javascript - Shiny /DT : Show Child Rows Upon Initial Load

javascript - 使用 JavaScript 生成的表格的 Web 抓取

python - 替换我的功能的更好方法?

Python 数据帧 : Describing a single column

r - 在不增加图例键的情况下增加图例键之间的空间

r - 针对异常序列创建 ID

r - 如何使用lapply从传递给函数的列表中获取data.frame的名称

r - 如何重写循环以在 R 中运行得更快?