2010-11-22 21 views
9

Estoy tratando de extraer datos de nuestra datamart Oracle en R usando RODBC. He podido resolver algunos de mis problemas, pero tengo una pregunta básica.RODBC Query Tuning

¿Cómo puedo conservar el formato tal como está en la base de datos?

con el siguiente comando

uapp <- sqlQuery(ch, SQL, stringsAsFactors=F) 

Mis datos son recuperados como se esperaba, pero algunos campos se convierten a numérico y lógico de vez en cuando R deben ser caracteres. Puedo evitar esto si uso:

uapp <- sqlQuery(ch, SQL, stringsAsFactors=F, as.is=T) 

Pero "perder" columnas que se están formateados como fechas en las que me gustaría que fueran.

+0

¿Qué es exactamente lo que quiere decir con "perder"? ¿Las columnas de fecha se convierten a números enteros o como la fecha predeterminada de Oracle (es decir, "22-NOV-10")? –

+0

Si uso la primera consulta, los campos de fecha se devuelven como POSIXct en el marco de datos. La segunda consulta es personaje. No es el fin del mundo, obviamente, pero estoy tratando de minimizar la corrección de los tipos de datos una vez dentro de R. – Btibert3

+0

Relacionado: http://stackoverflow.com/questions/38443157/rodbc-chars-and-numerics-converted-aggressively-with- sin-as-is – Scarabee

Respuesta

6

Estás atrapado en una brecha con la que he luchado también. No puedo opinar sobre lo que es "correcto" o "lo mejor", pero solo lo que hice en el pasado.

Normalmente hago lo que hice en el primer ejemplo y solo trato con los cambios de tipo una vez que ingresan a R. Si desea hacer este último método, puede convertir la fecha una vez que estuvo en R. Parece que mis sistemas Oracle estar siempre configurado para devolver las fechas en el formato "22-NOV-10", que es molesto como diablos analizar. Entonces usaría la función Oracle to_char() en mi consulta para formatear mis fechas en algo que R pueda reconocer fácilmente.

Así, por ejemplo, podría tener esto en mi instrucción SELECT:

to_char(myDate, 'yyyy-mm-dd') as myDate 

entonces me tire de que en una trama de datos llamada myData y hacer esto:

myData$properDate <- strptime(myData$myDate, "%Y-%m-%d") 

si ha de resolverla La fijación de fechas o el tratamiento de la fijación de otros campos realmente depende de la cantidad de campos de fecha que tenga y de la cantidad de campos sin fecha en los que el primer método se equivoca. Pero en mi experiencia, o bien termino arreglando uno, o el otro.

Algo que podría considerar al usar el método 1: intente usar cast() en su SQL para forzar un campo en un tipo particular. Las únicas veces que tuve problemas con RODBC molestar a mis tipos de datos es cuando el tipo es ambiguo en el lado del servidor. Por lo general, esto es el resultado de sentencias CASE o un poco de SQL en el extremo.

+0

Gracias JD. Daré una oportunidad, pero al menos confirma que tendré que hacer algunos preparativos de datos sin importar nada. – Btibert3

1

El argumento as.is puede ser un vector booleano.

Así que si su conjunto de resultados se compone de, por ejemplo, dos columnas de fecha seguidas de una columna de caracteres, que puede hacer:

uapp <- sqlQuery(ch, SQL, stringsAsFactors = F, as.is = c(F, F, T)) 
+1

FYI, también puede poner los números de las columnas que deberían estar "como están" (y dejando el resto por defecto, creo). Por ejemplo '... as.is = c (2, 4)' hará que las columnas 2 y 4 se interpreten "tal cual". – Kalin