2014-11-16

Función scan en R: manualmente y desde el portapapeles

Title La función scan nos permite tanto introducir datos directamente en la consola como desde el portapapeles o desde un fichero. En esta entrada trataremos de los dos primeros casos Es necesario especificar el tipo de objeto que importamos: numérico, carácter, complejo o lógico. Por defecto es numérico. Si los datos leídos no corresponden al tipo, ya sea por defecto o especificado a través de what, se genera un mensaje de error. Por ello diferenciaremos números, caracteres o una mezcla de ambos.

La función scan funciona con datos copiados de columnas desde HTML, Excel o desde Access. Si queremos copiar desde una fila, podemos transponerla previamente.

Números

1. Seleccionamos y copiamos los datos que queremos introducir en R. En nuestro caso desde Excel.

2. Ejecutamos el siguiente código en la consola.

x <- scan(dec = ",")
Especificamos el separador decimal coma pues por defecto es el punto y generaría un error.

3. En la consola aparecerá

 x <- scan(dec = ",")
1:
4. Presionamos Ctrl+V o bien botón secundario del ratón y seleccionamos pegar (paste).

> x <- scan(dec = ",")
1: 168,2624113
2: 205,9148936
3: 210
4: 212,3758865
5: 215,9361702
6: 222,9929078
7: 230
8: 231,3404255
9: 234,7588652
10: 240,893617
11: 
Read 10 items
De esta manera habremos creado un vector numérico. Podemos comprobarlo y la suma de 2.172,47 que nos daba en Excel.

str(x)

num [1:10] 168 206 210 212 216 ...
sum(x)

 [1] 2172.475

Caracteres

1. Seleccionamos y copiamos los datos de la columna que queremos introducir en R. En nuestro caso desde Excel, pero también se puede desde Access.

2. Ejecutamos el siguiente código en la consola.

x <- scan(what = character()) # Alternativa 1
x <- scan(what = "") # Alternativa 2
Especificamos el tipo de datos que leerá, caracteres en este caso.

3. En la consola aparecerá

 > x <- scan(what = character())
1:
4. Presionamos Ctrl+V o bien botón secundario del ratón y seleccionamos pegar (paste).

> x <- scan(what = character())
1: a
2: b
3: c
4: d
5: e
6: f
7: g
8: h
9: i
10: j
11: 
Read 10 items
De esta manera habremos creado un vector de caracteres. Podemos comprobarlo con:

str(x)

chr [1:10] "a" "b" "c" "d" "e" "f" "g" "h" "i" "j"

Números y caracteres

En este caso podríamos emplear una lista especificando los tipos para cada ítem.

x <- scan(what = list("", 0, 0, "", "", 0, "", "", "", "")) # Lista
> x <- scan(what = list("", 0, 0, "", "", 0, "", "", "", ""))
1: a
1: 1
1: 2
1: d
1: e
1: 10
1: g
1: h
1: i
1: j
2: 
Read 1 record
str(x)
List of 10
 $ : chr "a"
 $ : num 1
 $ : num 2
 $ : chr "d"
 $ : chr "e"
 $ : num 10
 $ : chr "g"
 $ : chr "h"
 $ : chr "i"
 $ : chr "j"
O bien leer todos como caracteres y manipularlos posteriormente:

x <- scan(what = "") # Como caracteres

Delimitador de campos

Si tratamos de leer números o caracteres con espacios en blanco introducimos el argumento sep para que tratar como delimitador el salto de línea y no el espacio en blanco. De esta manera cada fila será un ítem.

# Para números
x <- scan(sep = "\n")
 x <- scan(sep = "\n")
1: 1 2 4
2: 55 3
3: 88      7
4: 
Read 3 items
# Para texto
x <- scan(what = "", sep = "\n")
> x <- scan(what = "", sep = "\n")
1: APPLIANCES/DEVICES
2: BABY CARE
3: BATH & SHOWER
4: 
Read 3 items

Saltar la primera línea

Por ejemplo, si copiamos el encabezado de la columna y queremos eliminarlo, en nuestro ejemplo Etiquetas de fila. Como estamos pegando directamente desde el portapapeles, aunque especifiquemos el argumento skip = 1, importará la primera línea. Por ello, utilizamos esta alternativa.

x <- scan(what = "", sep = "\n") # Importamos como antes
 > x <- scan(what = "", sep = "\n")
1: Etiquetas de fila
2: APPLIANCES/DEVICES
3: BABY CARE
4: BATH & SHOWER
5: BODY CARE
6: BOOTS
7: CASUAL
8: 
Read 7 items
x <- x[-1] # Eliminamos primer elemento del vector
data.frame(x)
                   x
1 APPLIANCES/DEVICES
2          BABY CARE
3      BATH & SHOWER
4          BODY CARE
5              BOOTS
6             CASUAL

Entrada manual en la consola

En lugar de pegar el contenido, escribimos en la consola.

2 comentarios:

  1. Muy buena publicación, me ha servido bastante

    ResponderEliminar
    Respuestas
    1. Me alegro. Muchas gracias por el comentario. Saludos.

      Eliminar

Nube de datos