在lappy()中使用rbind()将多个数据帧合并为一个更大的data.frame

在lappy()中使用rbind()将多个数据帧合并为一个更大的data.frame,r,dataframe,lapply,read.table,rbind,R,Dataframe,Lapply,Read.table,Rbind,我使用的是R-Studio 0.99.491和R版本3.2.3(2015-12-10)。我是R的新手,非常感谢你的帮助。我正在做一个项目,尝试使用旧媒体服务器上的服务器日志来确定服务器中哪些文件夹/文件仍在被访问,哪些未被访问,以便我的团队知道要迁移哪些文件。每个日志都是24小时的,我有大约一年的日志,所以理论上,我应该能够看到过去一年中的所有访问 我的理想输出是获得一个树结构或绘图,它将显示服务器上正在使用的文件夹。我已经知道如何将一个日志(一天)作为data.frame读入R,然后使用R中的

我使用的是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))
})
#在文件夹中创建日志文件列表
文件
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另一个选项是
fread
from
data.table

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

您可以使用
purr
包中的
map\u df
而不是
lappy
,直接将所有结果合并为一个数据帧

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

或者可能有用
uridata
保持不变,因为函数在R中没有副作用,R是函数编程最重要的特性之一。正如@rawr指出的,您可以这样做,而不是
do.call(“rbind”,lappy(files,read.table,skip=3,header=T,stringsAsFactors=F))
。或者,如果您将
lappy
函数替换为
for循环
,则代码将正常工作。在
*apply
函数中创建的变量的作用域将限定为该函数,除非您使用
,这样就完美地解决了问题。当然,我应该在函数的开头将lappy()的结果传递到一个变量中,而不是试图将它们保存到lappy()中的一个变量中。谢谢你给我指点do.call()。
library(data.table)
rbindlist(lapply(files, fread, skip=3))
map_df(files, read.table, skip = 3, header = TRUE, stringsAsFactors = FALSE)