使用rbind()将多个数据框组合成lapply()

时间:2016-04-27 23:45:03

标签: r dataframe lapply read.table rbind

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

我理想的输出是获取树结构或图表,它将显示我们服务器上正在使用的文件夹。我已经想出如何将一个日志(一天)读入R作为data.frame,然后使用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循环之外,但每次循环运行时都会被覆盖。因此,我只获取最后一个'uriraw'文件的内容,而不是获取一个大数据框架。 (这就是为什么循环中有这两个注释的打印命令;我每次循环运行时都在测试数据帧中有多少行。)

任何人都可以澄清我做错了什么吗?同样,我想在最后组合一个大数据框,它将文件夹中每个(当前七个)日志文件的内容组合在一起。

3 个答案:

答案 0 :(得分:7)

do.call()是你的朋友。

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)

这是一种推荐的做事方式,因为&#34;成长&#34; R中动态的数据帧很痛苦。速度慢且内存昂贵,因为每次迭代都会构建一个新帧。

答案 1 :(得分:5)

您可以使用map_df包而不是purrr中的lapply直接将所有结果合并为数据框。

map_df(files, read.table, skip = 3, header = TRUE, stringsAsFactors = FALSE)

答案 2 :(得分:4)

另一个选项是来自fread

data.table
library(data.table)
rbindlist(lapply(files, fread, skip=3))