2014-12-14

Acceder a las variables de un data frame con attach en R

Title Usando la función attach podemos acceder a los nombres de las variables (columnas) de un data frame sin tener que repetir el nombre del data frame. Por ejemplo si queremos acceder a la variable height del data frame women.

# Sin usar attach
women$height
# Usando attach
attach(women)
height # Variable sin ir precedida del nombre del data frame
La función attach lo que hace realmente es crear un entorno en la ruta de búsqueda (search path) y en él copia los elementos de la lista o columnas del data frame. El search path es la ruta que R seguirá en la búsqueda de objetos y variables. El orden es importante: si el objeto lo encuentra en un entorno, no pasará al siguiente. Con attach, hacemos accesible para R ese data frame, y será posible referirse a sus variables directamente sin especificar el nombre del data frame.

Con la función search podemos listar las bases de datos, objetos y paquetes adjuntos. Contiene un environment por cada paquete cargado y objeto adjuntado al search path.

search()
Se puede apreciar que la base de datos women está en segunda posición global environment.

 [1] ".GlobalEnv"        "women"             "package:hflights" 
 [4] "package:dplyr"     "tools:rstudio"     "package:stats"    
 [7] "package:graphics"  "package:grDevices" "package:utils"    
[10] "package:datasets"  "package:methods"   "Autoloads"        
[13] "package:base"
Por defecto, R adjunta el objeto en la segunda posición del search path, inmediatamente después del global environment, el entorno de trabajo en el que trabajamos normalmente. Podemos alterar la posición del search path en la que adjuntará el objeto, pero no podemos asignarle la posición 1. Por ello, si creamos una variable con el mismo nombre en nuestro entorno de trabajo (global environment), R la encontrará primero en él, y no estaremos trabajando con el data frame deseado.

# Para desconectar el data frame
deattach(women)

Advertencias

Varios autores desaconsejan su uso porque, como vimos antes, puede originar confusión. La misma ayuda de la función attach nos advierte de los peligros de su uso:

  1. Referirnos a un nombre de un objeto erróneamente.
  2. Crear una nueva copia del objeto (data frame) en lugar de modificar el objeto ya vinculado (attached).
  3. Olvidar usar detach para desvincular la base de datos.
  4. Recomienda usar with en lugar de attach/detach.
El manual de estilo de R creado por google es más expeditivo con la función attach:

Las posibilidades de crear errores usando attach son numerosas. Se desaconseja su uso.

Efectos secundarios, un ejemplo

Creer que modificamos el objeto que acabamos de adjuntar (attach), cuando en realidad creamos un vector en el entorno de trabajo (global environment), dejando el objeto original adjunto en el search path sin alterar.

# Crea una nueva variable 
# en nuestro espacio de trabajo
height <- height*2
La asignación normal, mediante el operador <- crea una versión modificada de la variable en el entorno de trabajo (global environment). Cuando volvamos a utilizar la variable height, se referirá a la copia recién creada en el entorno de trabajo, no al data frame adjuntado en el search path.

height
[1] 232 236 240 244 248 252 256 260 264 268 272 276 280 284 288
Elimina el vector creado en el entorno de trabajo. Al volver a usar height se referirá al data frame previamente adjuntado.

rm(height)
Si queremos alterar el data frame adjuntado en el search path, usamos el operador <<- o la función assign:

# Para modificar la variable adjuntada (attached)
# en el search path
height <<- height*2
Cuando hayamos finalizado nuestro trabajo, es importante desvincular el data frame del global environment.

detach(women)

Alternativas

Una alternativa a la función attach es la función with.

# Sin attach
summary(women$height)
# Con with
with(women, summary(height))
Referencias:

2014-12-12

Reemplazar carácter en un fichero de texto con VBA en Excel cuadro diálogo

Title Anteriormente vimos como reemplazar carácter en un fichero de texto con VBA en Excel. En esta ocasión, en lugar de especificar en nuestro código la ruta y nombre del fichero, lo seleccionamos mediante un cuadro de diálogo. El nuevo fichero con el sufijo _final se creará en la misma ruta del fichero seleccionado.

Public Sub ReemplazarCaracteresExcel()

Application.ScreenUpdating = False
Set wb = Workbooks.Open(Filename:=Application.GetOpenFilename)
Ruta = ActiveWorkbook.FullName
RutaSinExtension = Left(Ruta, InStrRev(Ruta, ".") - 1)
wb.Close False

Set fso = CreateObject("Scripting.FileSystemObject")
If fso.FileExists(Ruta) Then
    Set objStream = fso.OpenTextFile(Ruta, 1, False, 0)
End If
    Set ObjCopy = fso.CreateTextFile(RutaSinExtension & "_final." & Right(Ruta, 3))

For x = 1 To 5  'Salta el nº de líneas indicadas: 5
   objStream.readline
Next x
 
Do While Not objStream.AtEndOfStream
    strOldLine = objStream.readline
    i = 1
    newarray = Split(strOldLine, ",") 'Carácter reemplazado: ,
       strNewLine = newarray(0)
       
    Do Until i = UBound(newarray) + 1
         strNewLine = strNewLine & ";" & newarray(i) 'Carácter nuevo: ;
         i = i + 1
    Loop
    ObjCopy.WriteLine strNewLine
Loop
Application.ScreenUpdating = True
MsgBox "Fichero creado: " & RutaSinExtension & "_final." & Right(Ruta, 3)

End Sub
Borramos estas 3 líneas en el caso de que en el fichero de texto no haya que saltarse líneas en blanco y que provocarían un error:

For x = 1 To 5  'Se salta el nº de líneas indicadas 
    objStream.readline
Next x

Entradas relacionadas:

2014-12-10

Actualizar origen de datos de Excel: atajo y con VBA

Title En Excel la manera más rápida de actualizar las tablas dinámicas y sus orígenes de datos es presionando:

Mediante código es sencillísimo:

Sub Actualizar()
    ThisWorkbook.RefreshAll
End Sub
En el caso de que solamente queramos actualizar una conexión y una tabla dinámica, veremos dos opciones. Es importante recordar que si la tabla dinámica actualizada comparte la misma caché de datos con otras, éstas también se actualizarán.

Sub Actualizar1()
    ThisWorkbook.Connections("NombredelaConexión").OLEDBConnection.Refresh
    Sheets("Hoja1").PivotTables("Nombre Tabla Dinámica").PivotCache.Refresh
End Sub
Sub Actualizar2()
    With Sheets("Hoja con la conexión").Range("A1")
    .ListObject.QueryTable.Refresh BackgroundQuery:=False
    End With
Sheets("Hoja1").PivotTables("Nombre Tabla Dinámica").PivotCache.Refresh
End Sub

2014-12-08

Relleno rápido

Title Relleno rápido es una nueva característica de Excel 2013 que nos ayuda a rellenar datos con más facilidad. Cuando relleno rápido reconoce un patrón ofrece una vista previa. Nos sirve para dividir una columna en diferentes componentes, agruparla, o mostrar los datos de una columna en un otro formato.
  1. Escribimos el texto deseado.
  2. Comenzamos a escribir el siguiente nombre, y Excel mostrará una vista previa de los nombres
  3. Presionamos entrar, o las teclas de dirección, y Relleno rápido completará la lista. Si no queremos usar los nombres sugeridos, presionamos Escape

Dividir columna

Agrupar columna

Formato

En el caso de fechas, para que reconozca el patrón correcto, es necesario introducir 3 fechas y después situarnos en la celda inferior y presionar Ctrl+E.

Notas

  • Para obtener sugerencias automáticas es necesario estar escribiendo junto a los datos relacionados, sin tener columnas en blanco en medio.
  • Para obtener sugerencias automáticas es necesario hacer dos ediciones seguidas, una tras otras sin hacer nada entre las dos (escribir en otra celda u hoja por ejemplo).
  • Relleno rápido no se activa automáticamente para los datos con formato de número. Es necesario apretar el botón homónimo en la pestaña Datos o Ctrl+E.
  • Si no muestra una vista previa, nos situamos en la celda inferior al texto introducido y presionamos Ctrl+E. Si no encuentra un patrón Excel nos avisará.
  • Cuando no acierta con el patrón correcto, le proporcionamos ejemplos adicionales para que Relleno rápido entienda el patrón adecuado: mayúsculas o minúsculas, nombres intermedios, etc.
Referencias:

2014-12-05

Calculadora y gráfica de la distribución normal no estándar en R

Title Con pequeñas modificaciones de la función creada anteriormente, podemos calcular y representar la probabilidad de un área bajo la curva de la función de densidad de una distribución normal no estándar.

Ejemplo: N(2, 9), media de 2 y varianza de 9.

En primer lugar nos pedirá el valor de la media y de la desviación típica. Si los dejamos en blanco asumirá que es una distribución normal estándar N(0,1). Luego nos solicitará dos valores, el límite inferior x1 y el superior x2. La función pnorm devuelve la probabilidad a la izquierda del valor especificado.

Intervalo: Pr(x1<X<x2) = Pr(X<x2) − Pr(X<x1)

  • Para calcular la probabilidad comprendida dentro de un intervalo, restamos de la probabilidad del límite superior x2 la probabilidad del límite inferior.
Cola izquierda: Pr(X<x2)

  • Para calcular la probabilidad por debajo de un valor, solamente introducimos el límite superior x2. Cuando nos solicite el límite inferior x1, lo dejamos en blanco y presionamos la tecla Entrar.
Cola derecha: Pr(X>x1)

  • Para calcular la probabilidad por encima de un valor, solamente introducimos el límite inferior x1. Cuando no solicite el límite superior x2, lo dejamos en blanco y presionamos la tecla Entrar.

Función

fun <- function(){
  # Pregunta la media y desviación típica 
  media <- as.numeric(readline("¿Cuál es la media?"))
  sd <- as.numeric(readline("¿Cuál es la desviación típica?"))
  # Distribución normal estándar si se dejan en blanco
  if (is.na(media)) {
    media <- 0
  }
  if (is.na(sd)) {
    sd <- 1
  }    
  # Límites
  x1 <- as.numeric(readline("¿Cuál es el valor inferior x1?"))
  x2 <- as.numeric(readline("¿Cuál es el valot superior x2?"))
  # Cola izquierda y derecha
  if (is.na(x1)) {
    x1 <- -100
  }
  if (is.na(x2)) {
    x2 <- 100
  }  
  prob <- pnorm(x2, media, sd) - pnorm(x1, media, sd)
  curve(dnorm(x, mean = media, sd = sd), 
        xlim=c(-4*sd, 4*sd), 
        las = 1, 
        main = bquote("Probabilidad:" ~ .(round(prob, 4))),
        ylab = bquote("Media:" ~ .(media) ~ "Desv. típica:"~ .(sd)))
  cord.x <- seq(x1, x2, 0.1)
  cord.y <- dnorm(cord.x, media, sd)
  polygon(c(x1, cord.x, x2), c(0, cord.y, 0), col = "skyblue") 
  prob
}

Intervalos

El ejemplo del gráfico anterior. Con una N(2, 9), calcular la probabilidad entre -1 y 1: Pr(-1<X<1)

# Ejecutamos la función
fun()
En la consola nos preguntará la media, la desviación típica y los dos límites del intervalo. Tecleamos todos.

¿Cuál es la media?2
¿Cuál es la desviación típica?3
¿Cuál es el valor inferior x1?-1
¿Cuál es el valot superior x2?1
La consola arrojará el resultado:

[1] 0.2107861
Creará el siguiente gráfico con el área sombreada. He modificado el código de la entrada anterior para que muestre la probabilidad en la misma línea del título y el título del eje de ordenadas con la media y desviación típica introducida. He usado la función bquote.

Ejemplo práctico

Si los resultados de un test del inteligencia realizados a unos niños se distribuyen con una media de un coeficiente intelectual de 100 y una desviación típica de 15. ¿Qué proporción de niños se espera que tengan un coeficiente de inteligencia entre 80 y 120?

¿Cuál es la media?100
¿Cuál es la desviación típica?15
¿Cuál es el valor inferior x1?80
¿Cuál es el valot superior x2?120
[1] 0.8175776
Entradas relacionadas:

2014-12-03

Multiplicar los elementos de un rango por una constante en Excel

Title A continuación la solución a un problema planteado por un compañero. ¿Cómo obtener en una celda el resultado de multiplicar los elementos de un rango de celdas por una constante? Es decir sin necesidad de crear otras columnas auxiliares o mediante el uso de la operación multiplicar en el pegado especial.

Mediante una fórmula matricial:

1. Introducimos en la celda de destino F4: =SUMA(F2*C2:D11)
2. Antes de salir presionamos Ctrl+Mayús+Entrar.

En el cuadro de fórmula aparecerá la expresión anterior rodeada de las llaves {}: {=SUMA(F2*C2:D11)} y en la celda el resultado 330.
Otra prolija alternativa:
=F2*(C2+C3+C4+C5+C6+C7+C8+C9+C10+C11+D2+D3+D4+D5+D6+D7+D8+D9+D10+D11)

Referencias:

2014-12-01

Aplicar una función a cada columna en R

Title En R se puede aplicar una función a las columnas de una matriz o un data frame mediante la función apply

Problema

Por ejemplo, imaginemos que queremos calcular la media de las columnas del conjunto de datos trees, cargado por defecto en R. Deberemos especificar siempre el nombre del data frame (trees) seguido de $ y el nombre de la columna correspondiente.

mean(trees$Girth)
mean(trees$Height)
mean(trees$Volume)
[1] 13.24839
[1] 76
[1] 30.17097

Solución

Podemos obtener el mismo resultado con una sola línea de código, y sin necesidad de saber los nombres de las columnas, usando la función apply.

La sintaxis de apply(X, MARGIN, FUN, ...) es:

X la matriz o data frame
MARGIN para indicar la aplicación de la función. 1 indica por filas y 2 indica por columnas
FUN la función que deseamos aplicar

apply(trees, 2, mean)
   Girth   Height   Volume 
13.24839 76.00000 30.17097 

Notas

En nuestro ejemplo, no necesitaríamos utilizar la función apply, pues hay una función que específicamente calcula la media por columnas colMeans. Lo mismo en el caso de la función suma con la función colSums. Estas funciones son equivalentes a apply con FUN = mean o FUN = sum con MARGIN = 2, pero son mucho más rápidas.

colMeans(trees)
   Girth   Height   Volume 
13.24839 76.00000 30.17097 
colSums(trees)
 Girth Height Volume 
 410.7 2356.0  935.3 
Para otro tipo de funciones, sí que será aconsejable usar la función apply.

apply(trees, 2, shapiro.test) # Test de normalidad Shapiro-Wilk
$Girth

 Shapiro-Wilk normality test

data:  newX[, i]
W = 0.9412, p-value = 0.08893


$Height

 Shapiro-Wilk normality test

data:  newX[, i]
W = 0.9655, p-value = 0.4034


$Volume

 Shapiro-Wilk normality test

data:  newX[, i]
W = 0.8876, p-value = 0.003579

Referencias:

2014-11-28

Duplicar forma en Excel

Title

Problema

Cuando copiamos una forma (Ctrl+C) y la volvemos a pegar (Ctrl+V), Excel la presenta desplazada (abajo a la derecha de la original).

Solución

  1. Seleccionamos la forma.
  2. Ctrl+J para duplicar la forma. Ctrl+D si nuestro Excel está en inglés.
  3. Arrastramos la forma a la posición deseada.
  4. Ctrl+J de nuevo. La forma se pegará duplicando también la posición relativa respecto del objeto original.

Solución en imágenes

Referencias:

2014-11-26

Conectando R con Ms Access mediante RODBC

Title El paquete RODBC conecta R con Ms Access. Con él podremos acceder a tablas y consultas ya creadas en Access: leer, guardar, copiar y manipular datos de tablas y consultas. El paquete emplea la conectividad ODBC (Open Database Connectivity) para establecer la conexión con Ms Access y mediante SQL (Structured Query Language) se interactúa con la base de datos.

Conexión de R con Ms Access

Instalamos y cargamos el paquete RODBC

install.packages("RODBC")
library(RODBC)
# Listado de DSNs disponibles
odbcDataSources()
                                             Excel Files 
"Microsoft Excel Driver (*.xls, *.xlsx, *.xlsm, *.xlsb)" 
                                      MS Access Database 
              "Microsoft Access Driver (*.mdb, *.accdb)" 
Establecemos la conexión, el canal. Emplearemos como ejemplo la base de datos Neptuno.mdb

# Interactivamente
canal <- odbcConnectAccess(file.choose()) 
# Escribiendo la ruta
neptuno <- "C:/Users/User1/Documents/R/Neptuno.mdb" # Ruta correspondiente
canal <- odbcConnectAccess(neptuno) 
# Base de datos en el directorio de trabajo
canal <- odbcConnectAccess("Neptuno.mdb") 
# Descargando el fichero zip
# en el directorio de trabajo
url <- "https://sites.google.com/site/nubededatosblogspotcom/Neptuno.zip"
download.file(url, "Neptuno")
unzip("Neptuno")
canal <- odbcConnectAccess("Neptuno.mdb") 
# Descargando el fichero zip
# en un archivo temporal
temp <- tempfile()
download.file("https://sites.google.com/site/nubededatosblogspotcom/Neptuno.zip", temp)
unzip(temp)
unlink(temp)
canal <- odbcConnectAccess("Neptuno.mdb") 
Detalles de la conexión

canal
RODBC Connection 1
Details:
  case=nochange
  DBQ=C:\Users\User1\Documents\R\Neptuno.mdb
  Driver={Microsoft Access Driver (*.mdb)}
  DriverId=25
  FIL=MS Access
  MaxBufferSize=2048
  PageTimeout=5
  UID=admin

Listado de tablas y consultas

Devuelve un data frame de las tablas y consultas accesibles desde la conexión ODBC establecida. Está compuesto de cinco columnas: catalog, schema, name, type and remarks. Incluye las tablas del sistema por defecto.

sqlTables(canal) 
       TABLE_CAT TABLE_SCHEM        TABLE_NAME   TABLE_TYPE REMARKS
1 C:\\R\\Neptuno        <NA> MSysAccessObjects SYSTEM TABLE    <NA>
2 C:\\R\\Neptuno        <NA>     MSysAccessXML SYSTEM TABLE    <NA>
3 C:\\R\\Neptuno        <NA>          MSysACEs SYSTEM TABLE    <NA>
4 C:\\R\\Neptuno        <NA>       MSysCmdbars SYSTEM TABLE    <NA>
5 C:\\R\\Neptuno        <NA>   MSysIMEXColumns SYSTEM TABLE    <NA>
6 C:\\R\\Neptuno        <NA>     MSysIMEXSpecs SYSTEM TABLE    <NA>
Para obtener una columna específica, empleamos el símbolo $ seguido del nombre de la columna.

sqlTables(canal)$TABLE_NAME # All objects' names
Especificamos el argumento tableType para elegir, tablas del sistema, tablas o consultas.

# Tablas del sistema
sqlTables(canal, tableType = "SYSTEM TABLE")$TABLE_NAME 
 [1] "MSysAccessObjects"          "MSysAccessXML"             
 [3] "MSysACEs"                   "MSysCmdbars"               
 [5] "MSysIMEXColumns"            "MSysIMEXSpecs"             
 [7] "MSysNameMap"                "MSysNavPaneGroupCategories"
 [9] "MSysNavPaneGroups"          "MSysNavPaneGroupToObjects" 
[11] "MSysNavPaneObjectIDs"       "MSysObjects"               
[13] "MSysQueries"                "MSysRelationships" 
# Tablas
sqlTables(canal, tableType = "TABLE")$TABLE_NAME
[1] "Categorías"          "Clientes"            "Compañías de envíos"
[4] "Detalles de pedidos" "Empleados"           "Pedidos"            
[7] "Productos"           "Proveedores"   
# Consultas
sqlTables(canal, tableType = "VIEW")$TABLE_NAME 
 [1] "Clientes y proveedores por ciudad"
 [2] "Consulta de pedidos"              
 [3] "Detalle de pedidos con descuento" 
 [4] "Facturas"                         
 [5] "Filtro facturas"                  
 [6] "Lista alfabética de productos"  

Estructura de las columnas

Devuelve un data frame con la información de las columnas de las tablas o consultas de la conexión establecida (canal).

 [1] "TABLE_CAT"         "TABLE_SCHEM"      
 [3] "TABLE_NAME"        "COLUMN_NAME"      
 [5] "DATA_TYPE"         "TYPE_NAME"        
 [7] "COLUMN_SIZE"       "BUFFER_LENGTH"    
 [9] "DECIMAL_DIGITS"    "NUM_PREC_RADIX"   
[11] "NULLABLE"          "REMARKS"          
[13] "COLUMN_DEF"        "SQL_DATA_TYPE"    
[15] "SQL_DATETIME_SUB"  "CHAR_OCTET_LENGTH"
[17] "ORDINAL_POSITION"  "IS_NULLABLE"      
[19] "ORDINAL" 
Para obtener una columna específica, empleamos el símbolo $ seguido del nombre de la columna.

sqlColumns(canal, "Clientes")$COLUMN_NAME
 [1] "IdCliente"      "NombreCompañía" "NombreContacto"
 [4] "CargoContacto"  "Dirección"      "Ciudad"        
 [7] "Región"         "CódPostal"      "País"          
[10] "Teléfono"       "Fax"      

Manipulación de datos

Antes de manipular datos es recomendable hacer una copia de seguridad. Las funciones sqlUpdate y sqlDrop ocasionan cambios o pérdidas de datos irreversibles.

    Leer e importar datos

Tenemos dos opciones:

  1. sqlFetch tanto para tablas como consultas ya existentes.
  2. ConsultaDePedidos <- sqlFetch(canal, sqtable = "Detalles de pedidos")
    # Para limitar el nº de filas importadas: max
    ConsultaDePedidos <- sqlFetch(canal, sqtable = "Detalles de pedidos", max = 100)
    
  3. sqlQuery para enviar consultas SQL a la base de datos de Ms Access. Se puede incluir cualquier sentencia válida de SQL, incluyendo la creación, modificación, actualización o selección.
  4. Clientes <- sqlQuery(canal, "SELECT * FROM Clientes")
    # Para limitar el nº de filas leídas: max
    Clientes <- sqlQuery(canal, "SELECT * FROM Clientes", max = 10)
    
Para evitar errores cuando el nombre de las tablas o consultas incluyen espacios en blanco, los escribimos entre corchetes.

ConsultaDePedidos <- sqlQuery(canal, "SELECT * FROM [Consulta de pedidos]")
Una consulta más compleja, Facturas de la Neptuno.mdb, copiando el código directamente SQL. Sustituimos las comillas dobles " " por simples ' '[Nombre] & ' ' & [Apellidos] para evitar el error: Error: unexpected string constant.

Facturas <- sqlQuery(canal, "SELECT Pedidos.Destinatario, Pedidos.DirecciónDestinatario, Pedidos.CiudadDestinatario,                          Pedidos.RegiónDestinatario, Pedidos.CódPostalDestinatario, Pedidos.PaísDestinatario, Pedidos.IdCliente, Clientes.NombreCompañía, Clientes.Dirección, Clientes.Ciudad, Clientes.Región, Clientes.CódPostal, Clientes.País, [Nombre] & ' ' & [Apellidos] AS Vendedor, Pedidos.IdPedido, Pedidos.FechaPedido, Pedidos.FechaEntrega, Pedidos.FechaEnvío, [Compañías de envíos].NombreCompañía, [Detalles de pedidos].IdProducto, Productos.NombreProducto, [Detalles de pedidos].PrecioUnidad, [Detalles de pedidos].Cantidad, [Detalles de pedidos].Descuento, CCur([Detalles de pedidos].PrecioUnidad*[Cantidad]*(1-[Descuento])/100)*100 AS PrecioConDescuento, Pedidos.Cargo
FROM Productos INNER JOIN ((Empleados INNER JOIN ([Compañías de envíos] INNER JOIN (Clientes INNER JOIN Pedidos ON Clientes.IdCliente = Pedidos.IdCliente) ON [Compañías de envíos].IdCompañíaEnvíos = Pedidos.FormaEnvío) ON Empleados.IdEmpleado = Pedidos.IdEmpleado) INNER JOIN [Detalles de pedidos] ON Pedidos.IdPedido = [Detalles de pedidos].IdPedido) ON Productos.IdProducto = [Detalles de pedidos].IdProducto")
Source: local data frame [2,155 x 26]

           Destinatario DirecciónDestinatario CiudadDestinatario
1           Wilman Kala         Keskuskatu 45           Helsinki
2           Wilman Kala         Keskuskatu 45           Helsinki
3           Wilman Kala         Keskuskatu 45           Helsinki
4    Toms Spezialitäten         Luisenstr. 48            Münster
5    Toms Spezialitäten         Luisenstr. 48            Münster
6         Hanari Carnes       Rua do Paço, 67     Río de Janeiro
7         Hanari Carnes       Rua do Paço, 67     Río de Janeiro
8         Hanari Carnes       Rua do Paço, 67     Río de Janeiro
9  Victuailles en stock    2, rue du Commerce               Lyon
10 Victuailles en stock    2, rue du Commerce               Lyon
..                  ...                   ...                ...
Variables not shown: RegiónDestinatario (fctr), CódPostalDestinatario (fctr), PaísDestinatario (fctr), IdCliente (fctr), NombreCompañía (fctr), Dirección (fctr), Ciudad (fctr), Región (fctr), CódPostal (fctr), País (fctr), Vendedor (fctr), IdPedido (int), FechaPedido (time), FechaEntrega (time), FechaEnvío (time), NombreCompañía.1 (fctr), IdProducto (int), NombreProducto (fctr), PrecioUnidad (dbl), Cantidad (int), Descuento (dbl), PrecioConDescuento (dbl), Cargo (dbl)

    Creación de tablas

Para crear una tabla en Access a partir de un data frame utilizamos la función sqlSave. Los principales argumentos son:

channel - conexión creada con odbcConnect.
dat - data frame.
tablename - nombre de la tabla creada, por defecto el del data frame.
rownames - valor lógico (TRUE o FALSE) o el nombre de la columna de los nombres de de fila.
addPK - valor lógico, para establecer los rownames (nombres de fila) como clave principal.

# Nombre de la nueva tabla el del data frame 
sqlSave(canal, women, rownames = FALSE) 
# Especificando el nombre de la nueva tabla
sqlSave(canal, women, "mujeres", rownames = FALSE)
# filas (rownames) como clave principal
sqlSave(canal, women, "mujeres", rownames = "filas", addPK = TRUE)

    Actualización de tablas

sqlUpdate actualiza la tabla siempre que las filas ya existan. Si no, generará un error: [RODBC] Failed exec in Update. Los principales argumentos son:

channel - conexión creada con odbcConnect.
dat - data frame.
tablename - nombre de la tabla creada, por defecto el del data frame.
index - columna que empleará como clave principal, común al da addPK - valor lógico, para establecer los rownames (nombres de fila) como clave principal.

Ejemplo 1

# Tabla con clave principal filas
sqlSave(canal, women, "mujeres", rownames = "filas", addPK = TRUE)
# La columna filas es un campo de texto (VARCHAR)
sqlColumns(canal, "mujeres")[c(4, 6)]
  COLUMN_NAME TYPE_NAME
1       filas   VARCHAR
2      height    DOUBLE
3      weight    DOUBLE
Datos originales:

sqlFetch(canal, "mujeres", max = 6)
  filas height weight
1     1     58    115
2     2     59    117
3     3     60    120
4     4     61    123
5     5     62    126
6     6     63    129
# Data frame act con los registros a actualizar
# Por ser filas un campo de texto 
# en la tabla mujeres as.character

filas <- as.character(c(1, 2, 3)) 
height <- c(70, 75, 80)
weight <- c(120, 125, 130)
act <- data.frame(filas, height, weight)
# Actualizamos usando filas como index
sqlUpdate(canal, act, "mujeres", index = "filas")
Datos actualizados:

sqlFetch(canal, "mujeres", max = 6)
  filas height weight
1     1     70    120
2     2     75    125
3     3     80    130
4     4     61    123
5     5     62    126
6     6     63    129

Ejemplo 2

Otro ejemplo actualizando la tabla Clientes de Neptuno.

# Data frame act con los registros a actualizar
IdCliente <- c("ALFKI", "BLAUS", "ANATR", "ANTON")
NombreCompañía <- c("Alfred J. Kwak", "Der Blaue Reiter", 
                    "Anaconda","Anton Pirulero")
act <- data.frame(IdCliente, NombreCompañía)

# Actualización usando la clave principal IdCliente 
sqlUpdate(canal, act, "Clientes", index = "IdCliente") 
  IdCliente     NombreCompañía
1     ALFKI     Alfred J. Kwak
2     ANATR           Anaconda
3     ANTON     Anton Pirulero
4     AROUT    Around the Horn
5     BERGS Berglunds snabbköp
6     BLAUS   Der Blaue Reiter 

Eliminación de tablas

Para eliminar tablas o consultas de la base de datos empleamos la función sqlDrop. Cuidado pues la acción es irreversible.

sqlDrop(channel = canal, "women")

Referencias

Nube de datos