family - Usando rbind() para combinar múltiples marcos de datos en un data.frame más grande dentro de lapply()
r apply lapply sapply mapply (3)
Otra opción es fread
from data.table
library(data.table)
rbindlist(lapply(files, fread, skip=3))
Estoy usando R-Studio 0.99.491 y R versión 3.2.3 (12/12/2015). Soy relativamente novato con R, y agradecería algo de ayuda. Estoy haciendo un proyecto en el que intento usar los registros del servidor en un antiguo servidor de medios para identificar a qué carpetas / archivos del servidor todavía se está accediendo y cuáles no, para que mi equipo sepa qué archivos migrar. Cada registro es por un período de 24 horas, y tengo aproximadamente un año de registros, por lo que, en teoría, debería poder ver todo el acceso durante el año pasado.
Mi resultado ideal es obtener una estructura de árbol o una gráfica que me muestre las carpetas de nuestro servidor que se están utilizando. He descubierto cómo leer un registro (un día) en R como un data.frame y luego usar el paquete data.tree en R para convertirlo en un árbol. Ahora, quiero examinar recursivamente todos los archivos en el directorio, uno por uno, y agregarlos a ese data.frame original, antes de crear el árbol. Aquí está mi código actual:
#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))
})
El problema es que, sin importar lo que intente, el valor de ''uridata'' dentro del ciclo de lapply parece que no se guarda / pasa fuera del ciclo de lapply, pero de alguna manera se sobrescribe cada vez que se ejecuta el ciclo. Entonces, en lugar de obtener un gran archivo de datos, obtengo el contenido del último archivo ''uriraw''. (Es por eso que existen esos dos comandos de impresión comentados dentro del ciclo, estaba probando cuántas líneas había en los marcos de datos cada vez que se ejecutaba el ciclo).
¿Alguien puede aclarar lo que estoy haciendo mal? De nuevo, me gustaría tener un gran marco de datos al final que combine el contenido de cada uno de los (actualmente siete) archivos de registro en la carpeta.
Puede usar map_df
del paquete purrr
lugar de lapply
, para tener todos los resultados combinados directamente como un marco de datos.
map_df(files, read.table, skip = 3, header = TRUE, stringsAsFactors = FALSE)
do.call()
es tu amigo.
big.list.of.data.frames <- lapply(files, function(x){
read.table(x, skip = 3, header = TRUE, stringsAsFactors = FALSE)
})
o más concisamente (pero menos-tratable):
big.list.of.data.frames <- lapply(files, read.table,
skip = 3,header = TRUE,
stringsAsFactors = FALSE)
Entonces:
big.data.frame <- do.call(rbind,big.list.of.data.frames)
Esta es una forma recomendada de hacer cosas porque "crecer" un cuadro de datos dinámicamente en R es doloroso. Lento y costoso para la memoria, porque se crea un nuevo marco en cada iteración.