Saltar al contenido principal
LibreTexts Español

6.1: Lectura de archivos CSV

  • Page ID
    149770
  • \( \newcommand{\vecs}[1]{\overset { \scriptstyle \rightharpoonup} {\mathbf{#1}} } \)

    \( \newcommand{\vecd}[1]{\overset{-\!-\!\rightharpoonup}{\vphantom{a}\smash {#1}}} \)

    \( \newcommand{\id}{\mathrm{id}}\) \( \newcommand{\Span}{\mathrm{span}}\)

    ( \newcommand{\kernel}{\mathrm{null}\,}\) \( \newcommand{\range}{\mathrm{range}\,}\)

    \( \newcommand{\RealPart}{\mathrm{Re}}\) \( \newcommand{\ImaginaryPart}{\mathrm{Im}}\)

    \( \newcommand{\Argument}{\mathrm{Arg}}\) \( \newcommand{\norm}[1]{\| #1 \|}\)

    \( \newcommand{\inner}[2]{\langle #1, #2 \rangle}\)

    \( \newcommand{\Span}{\mathrm{span}}\)

    \( \newcommand{\id}{\mathrm{id}}\)

    \( \newcommand{\Span}{\mathrm{span}}\)

    \( \newcommand{\kernel}{\mathrm{null}\,}\)

    \( \newcommand{\range}{\mathrm{range}\,}\)

    \( \newcommand{\RealPart}{\mathrm{Re}}\)

    \( \newcommand{\ImaginaryPart}{\mathrm{Im}}\)

    \( \newcommand{\Argument}{\mathrm{Arg}}\)

    \( \newcommand{\norm}[1]{\| #1 \|}\)

    \( \newcommand{\inner}[2]{\langle #1, #2 \rangle}\)

    \( \newcommand{\Span}{\mathrm{span}}\) \( \newcommand{\AA}{\unicode[.8,0]{x212B}}\)

    \( \newcommand{\vectorA}[1]{\vec{#1}}      % arrow\)

    \( \newcommand{\vectorAt}[1]{\vec{\text{#1}}}      % arrow\)

    \( \newcommand{\vectorB}[1]{\overset { \scriptstyle \rightharpoonup} {\mathbf{#1}} } \)

    \( \newcommand{\vectorC}[1]{\textbf{#1}} \)

    \( \newcommand{\vectorD}[1]{\overrightarrow{#1}} \)

    \( \newcommand{\vectorDt}[1]{\overrightarrow{\text{#1}}} \)

    \( \newcommand{\vectE}[1]{\overset{-\!-\!\rightharpoonup}{\vphantom{a}\smash{\mathbf {#1}}}} \)

    \( \newcommand{\vecs}[1]{\overset { \scriptstyle \rightharpoonup} {\mathbf{#1}} } \)

    \( \newcommand{\vecd}[1]{\overset{-\!-\!\rightharpoonup}{\vphantom{a}\smash {#1}}} \)

    Quizás el formato más simple para el intercambio de datos entre sistemas informáticos es el archivo de valores separados por comas estándar de facto, o csv. R proporciona una función para leer directamente datos de un archivo csv y asignarlos a un marco de datos:

    > processors <- read.csv("all-data.csv")

    El nombre entre las comillas es el nombre del archivo con formato csv que se va a leer. Cada línea de archivo corresponde a un registro de datos. Las comas separan los campos de datos individuales en cada registro. Esta función asigna cada registro de datos a una nueva fila en el marco de datos y asigna cada campo de datos a la columna de ejecución. Cuando se completa esta función, los procesadores de variables contienen todos los datos del archivo all-data.csv bien organizados en filas y columnas en un marco de datos.

    Si escribe procesadores para ver qué se almacena en el marco de datos, obtendrá una larga y confusa lista de datos. Mecanografía

    > head(processors)
    

    mostrará una lista de encabezados de columna y los valores de las primeras filas de datos. A partir de esta lista, podemos determinar qué columnas extraer para nuestro desarrollo de modelos. Si bien esto es conceptualmente un problema simple, la ejecución puede ser bastante desordenada, dependiendo de cómo se recopilaron y organizaron los datos en el archivo.

    Como con cualquier lenguaje de programación, R te permite definir tus propias funciones. Esta característica es útil cuando se debe realizar una secuencia de operaciones varias veces en diferentes piezas de datos, por ejemplo. El formato para definir una función es:

    function-name <- function(a1, a2, ...) { R expressions
    return(object)
    }

    donde nombre-función es el nombre de función que elija y a1, a2,... es la lista de argumentos en tu función. El sistema R evalúa las expresiones en el cuerpo de la definición cuando se llama a la función. Una función puede devolver cualquier tipo de objeto de datos utilizando la instrucción return ().

    Vamos a definir una nueva función llamada extract_data para extraer todas las filas que tengan un resultado para el programa de referencia dado del marco de datos de los procesadores. Por ejemplo, llamar a la función de la siguiente manera:

    > int92.dat <- extract_data("Int1992") 
    > fp92.dat <- extract_data("Fp1992")
    > int95.dat <- extract_data("Int1995") 
    > fp95.dat <- extract_data("Fp1995")
    > int00.dat <- extract_data("Int2000") 
    > fp00.dat <- extract_data("Fp2000")
    > int06.dat <- extract_data("Int2006") 
    > fp06.dat <- extract_data("Fp2006")

    extrae cada fila que tiene un resultado para el programa de referencia dado y lo asigna al marco de datos correspondiente, int92.dat, fp92.dat, y así sucesivamente.

    Definimos la función extract_data de la siguiente manera:

    extract_data <- function(benchmark) {
    
    temp <- paste(paste("Spec",benchmark,sep=""), "..average.base.", sep="")
    
    perf <- get_column(benchmark,temp) 
    
    max_perf <- max(perf)
    min_perf <- min(perf)
    range <- max_perf - min_perf
    nperf <- 100 * (perf - min_perf) / range
    
    clock <- get_column(benchmark,"Processor.Clock..MHz.") 
    threads <- get_column(benchmark,"Threads.core")
    cores <- get_column(benchmark,"Cores")
    TDP <- get_column(benchmark,"TDP")
    transistors <- get_column(benchmark,"Transistors..millions.") 
    dieSize <- get_column(benchmark,"Die.size..mm.2.")
    voltage <- get_column(benchmark,"Voltage..low.")
    featureSize <- get_column(benchmark,"Feature.Size..microns.") 
    channel <- get_column(benchmark,"Channel.length..microns.") 
    FO4delay <- get_column(benchmark,"FO4.Delay..ps.")
    L1icache <- get_column(benchmark,"L1..instruction...on.chip.") 
    L1dcache <- get_column(benchmark,"L1..data...on.chip.") 
    L2cache <- get_column(benchmark,"L2..on.chip.")
    L3cache <- get_column(benchmark,"L3..on.chip.")
    
    return(data.frame(nperf, perf, clock, threads, cores, TDP, transistors, dieSize, 
    voltage, featureSize, channel, FO4delay, L1icache, L1dcache, L2cache, L3cache))
    }
    

    La primera línea con las funciones de pegar parece bastante complicada. Como- nunca, simplemente forma el nombre de la columna con los resultados de referencia dados. Por ejemplo, cuando se llama a extract_data con Int2000 como el valor ar, las funciones de pegar anidadas simplemente concatenar las cadenas "Spec “," Int2000 “y".. promedio.base. ”. La cadena final corresponde al nombre de la columna en el marco de datos del procesador que contiene los resultados perfor- mance para el benchmark Int2000, "SPECint2000.. promedio.base. ”.

    La siguiente línea llama a la función get_column, que selecciona todas las filas con el nombre de columna deseado. En este caso, esa columna contiene el resultado de desempeño real reportado para el programa de referencia dado, perf. Las siguientes cuatro líneas computan el valor de rendimiento normalizado, nperf, a partir del valor perf que obtuvimos del marco de datos. La siguiente secuencia de llamadas a get_column extrae los datos de cada uno de los predictores que pretendemos utilizar en el desarrollo del modelo de regresión. Tenga en cuenta que el segundo parámetro en cada caso, como "Procesador.Reloj.. MHz. “, es el nombre de una columna en el marco de datos del procesador. Finalmente, la función data.frame () es una función R predefinida que ensambla todos sus argumentos en un solo marco de datos. La nueva función que acabamos de definir, extract_data (), devuelve este nuevo marco de datos.

    A continuación, definimos la función get_column () para devolver todos los datos en una columna dada para la cual se ha definido el programa de referencia dado:

    get_column <- function(x,y) {
    
    benchmark <- paste(paste("Spec",x,sep=""), "..average.base.", sep="")
    ix <- !is.na(processors[,benchmark]) return(processors[ix,y])
    }
    

    El argumento x es una cadena con el nombre del programa de referencia, e y es una cadena con el nombre de la columna deseada. Las funciones de paste () anidadas producen el mismo resultado que la función extract_data (). La función is.na () realiza el interesante trabajo. Esta función devuelve un vector con valores “1” correspondientes a los números de fila en la trama de datos del procesador que tienen valores NA en la columna seleccionada por el índice de referencia. Si hay un valor en esa ubicación, is.na () devolverá un valor correspondiente que es un 0. Así, is.na indica a qué filas faltan resultados de desempeño para el benchmark de interés. Insertar el signo de exclamación frente a esta función complementa su salida. Como resultado, la variable ix contendrá un vector que identifica cada fila que contiene resultados de desempeño para el programa de referencia indicado. La función luego extrae las filas seleccionadas del marco de datos del procesador y las devuelve.

    Este tipo de funciones de extracción de datos pueden ser algo complicadas de escribir, ya que dependen tanto del formato específico de su archivo de entrada. Las funciones que se presentan en este capítulo son una guía para escribir sus propias funciones de extracción de datos.


    This page titled 6.1: Lectura de archivos CSV is shared under a CC BY-NC 4.0 license and was authored, remixed, and/or curated by David Lilja (University of Minnesota Libraries Publishing) via source content that was edited to the style and standards of the LibreTexts platform; a detailed edit history is available upon request.