¿Cómo agregar un índice por conjunto de datos cuando se usa rbindlist?
csv data.table (2)
Esta es una versión mejorada de la respuesta de Nicolás que agrega los nombres de los archivos en lugar de los números:
x2csv <- rbindlist(lapply(files, fread), idcol = "origin")
x2csv[, origin := factor(origin, labels = basename(files))]
-
fread()
usastringsAsFactors = FALSE
por defecto para que podamos guardar algunas pulsaciones de teclas -
fill = TRUE
solo es necesario si queremos leer archivos con estructura diferente, por ejemplo, posición, nombre o número de columnas diferentes -
El id col se puede nombrar (el valor predeterminado es
.id
) y se completa con el número de secuencia del elemento de la lista. -
Luego, este número se convierte en un factor cuyos niveles están etiquetados con los nombres de los archivos.
Un nombre de archivo puede ser más fácil de recordar que un simple número.
basename()
elimina la ruta del nombre del archivo.
Tengo varios archivos csv diferentes con la misma estructura.
Los leí en R usando fread, y luego los uní en un conjunto de datos más grande usando
rbindlist()
.
files <- list.files( pattern = "*.csv" );
x2csv <- rbindlist( lapply(files, fread, stringsAsFactors=FALSE), fill = TRUE )
El código funciona bien. Sin embargo, me gustaría agregar una columna llena de números para indicar de qué archivo csv proviene esa observación. Por ejemplo, la salida debería ser:
V1 V2 V3 C1
1: 0 0.2859163 0.55848521 1
2: 1 1.1616298 0.87571349 1
3: 2 2.1122510 0.95062116 2
4: 3 2.6832013 0.57095035 2
5: 4 2.9117493 0.22854804 2
6: 5 2.9886040 0.07685464 3
donde C1 es la nueva columna de índice que dice que: la primera y segunda observaciones provienen de los archivos [1] (el primer archivo .csv); la tercera y cuarta observación provienen de los archivos [1] (el primer archivo .csv); y así.
Solo le falta el argumento
rbindlist()
de
rbindlist()
.
Correr:
x2csv <- rbindlist(lapply(files, fread, stringsAsFactors = FALSE), fill = TRUE, idcol = TRUE )