Entonces, tengo un archivo CSV grande con aproximadamente 280 columnas y mil millones de datos con un tamaño de archivo de aproximadamente 20 GB. A continuación se proporciona una muestra de este archivo (con aproximadamente 7 columnas y 4 filas):
SL No.,Roll No.,J_Date,F_Date,S1,S2,S3
1,00123456789,2004/09/11,2009/08/20,43,67,56
2,987654321,2010/04/01,2015/02/20,82,98,76
3,0123459876,2000/06/25,2005/10/02,72,84,02
4,000543216789,1990/08/29,1998/05/31,15,64,82
Ahora, dado el hecho de que el archivo es tan grande, tendría que leer este archivo en fragmentos más pequeños a la vez y poder especificar el tamaño del fragmento . Pero como puede haber visto en la muestra, "Roll No." debe leerse como un "carácter" y no como un "numérico" . También necesito agregar las columnas "S1", "S2", "S3" y escribir la suma en una nueva columna "MM" .
La salida de la muestra anterior tiene que ser algo como esto:
SL No.,Roll No.,J_Date,F_Date,S1,S2,S3,MM
1,00123456789,2004/09/11,2009/08/20,43,67,56,166
2,987654321,2010/04/01,2015/02/20,82,98,76,256
3,0123459876,2000/06/25,2005/10/02,72,84,02,158
4,000543216789,1990/08,29,1998/05/31,15,64,82,161
Sé que se han hecho preguntas similares antes, pero juro que no pude obtener una respuesta que funcionó para mí. Remití las siguientes consultas:
R: ¿Bucles para procesar grandes conjuntos de datos (GB) en fragmentos?
Recorte de un archivo csv enorme (3,5 GB) para leerlo en R
¿Cómo leo solo las líneas que cumplen una condición de un csv en R?
Lea la entrada numérica como cadena R y muchas más.
Este podría ser un buen momento para decir que soy un principiante total en lo que respecta a R, por lo que todo tipo de ayuda sería muy apreciada. He estado sentado en esto durante mucho tiempo.
No puedo decir que haya hecho esto antes, pero creo que debería funcionar.
library( data.table )
# set the input and output files
input.file <- "foo.csv"
output.file <- sub( "\\.csv$", "_output\\.csv", input.file )
# get column names by importing the first few lines
column.names <- names( fread( input.file, header = TRUE, nrows = 3L ) )
# write those column names as a line of text (header)
cat( paste( c( column.names, "MM" ), collapse = "," ),
file = output.file, append = FALSE )
cat( "\n", file = output.file, append = TRUE )
# decide how many rows to read at a time
rows.at.a.time <- 1E4L
# begin looping
start.row <- 1L
while( TRUE ) {
# read in only the specified lines
input <- fread( input.file,
header = FALSE,
skip = start.row,
nrows = rows.at.a.time
)
# stop looping if no data was read
if( nrow( input ) == 0L ) break
# create the "MM" column
input[ , MM := rowSums( .SD[ , 5:7 ] ) ]
# append the data to the output file
fwrite( input,
file = output.file,
append = TRUE, col.names = FALSE )
# bump the `start.row` parameter
start.row <- start.row + rows.at.a.time
# stop reading if the end of the file was reached
if( nrow( input ) < rows.at.a.time ) break
}
ACTUALIZACIÓN: para preservar las cadenas de caracteres, puede importar todas las columnas como caracteres especificando en la fread
llamada dentro del ciclo:
colClasses = rep( "character", 280 )
Luego, para realizar las sumas de filas (ya que ahora tiene todas las columnas de caracteres), debe incluir una conversión allí. Lo siguiente reemplazaría la línea única (la que tiene este mismo comentario encima) en el código:
# create the "MM" column
input[ , MM := .SD[ , 5:7 ] %>%
lapply( as.numeric ) %>%
do.call( what = cbind ) %>%
rowSums()
]
Donde 5:7
se especifica aquí, puede reemplazar con cualquier vector de referencias de columna que se pasará arowSums()
Tenga en cuenta que si usa lo anterior con %>%
tuberías, necesitará library(magrittr)
en la parte superior de su código para cargar la función.
Este artículo se recopila de Internet, indique la fuente cuando se vuelva a imprimir.
En caso de infracción, por favor [email protected] Eliminar
Déjame decir algunas palabras