2010-12-02 24 views
14

Me gustó Python antes porque Python tiene tipos integrados ricos como conjuntos, dictados, listas, tuplas. Estas estructuras ayudan a escribir secuencias de comandos cortas para procesar datos.R como un lenguaje de programación de uso general

En el otro lado, R es como Matlab, y tiene escalar, vector, marco de datos, matriz y lista como sus tipos de datos. Pero carece de conjuntos, dictados, tuplas, etc. Sé que el tipo de lista es poderoso, muchas operaciones podrían considerarse como el procesamiento de listas. Pero la idea de usar R como lenguaje de propósito general sigue siendo vaga.

(El siguiente es sólo un ejemplo. No quiero decir que me centro en el procesamiento de texto/minería.)

Por ejemplo, tengo que hacer TF-IDF contando para un conjunto de artículos de noticias (digamos 200.000 artículos en una carpeta y sus subcarpetas).

Después de leer los archivos, necesito hacer un mapeo de palabra a identificación y otras tareas de conteo. Estas tareas implican la manipulación de cadenas y necesitan contenedores como conjunto o mapa.

Sé que puedo usar otro idioma para hacer este procesamiento y cargar los datos en R. Pero quizás (para cosas pequeñas) poner todo el preprocesamiento en una sola secuencia de comandos R es mejor.

Entonces mi pregunta es si R tiene suficiente capacidad en este tipo de estructuras de datos ricas en el nivel de idioma? O si no, ¿algún paquete proporciona una buena extensión para el lenguaje R?

+1

No es una respuesta directa a su pregunta, pero ¿tiene conocimiento de cosas como rpy2? Le permite convertir objetos Python en objetos R y usar funciones R en ellos. Entonces puede hacer el procesamiento de Python, luego el procesamiento R en el mismo script, aunque con una sintaxis un poco más larga. –

+0

@Thomas No es una solución. Mi preocupación es que quiero seguir con R y usar menos cosas externas como sea posible. Especialmente cuando doy mi código, sería mejor si el usuario final solo necesita instalar R. –

+0

los conjuntos están disponibles en el paquete 'sets'. Dado que los vectores tienen elementos nombrados, se comportan de manera muy similar a los dictados para la mayoría de los propósitos. (Un data.frame con id y columnas de valores también funciona como dict.) –

Respuesta

21

Creo que la capacidad de procesamiento previo de datos de R, es decir, todo, desde extraer datos de su fuente y justo antes de los pasos de análisis, ha mejorado sustancialmente en los últimos tres años (el tiempo que he estado usando R). Utilizo Python a diario y durante los últimos siete años aproximadamente (sus capacidades de procesamiento de texto son excelentes) y aún así no dudaría ni un momento en usar R para el tipo de tarea que mencionas.

Un par de condiciones, sin embargo.En primer lugar, sugeriría mirando muy de cerca en un par de los externos paquetes para el conjunto de tareas en su Q - en particular, de hash (python-como estructura de datos clave-valor), y stringr (compuesta principalmente por envolturas más de las funciones menos fáciles de usar de manipulación de cadenas en la base de la biblioteca)

Tanto stringr y de hash están disponibles en CRAN.

> library(hash) 
> dx = hash(k1=453, k2=67, k3=913) 
> dx$k1 
    [1] 453 
> dx = hash(keys=letters[1:5], values=1:5) 
> dx 
    <hash> containing 5 key-value pair(s). 
    a : 1 
    b : 2 
    c : 3 
    d : 4 
    e : 5 

> dx[a] 
    <hash> containing 1 key-value pair(s). 
    a : 1 

> library(stringr) 
> astring = 'onetwothree456seveneight' 
> ptn = '[0-9]{3,}' 
> a = str_extract_all(astring, ptn) 
> a 
    [[1]] 
    [2] "456" 

Parece también que existe un gran subconjunto de los usuarios de I para los cuales el procesamiento de textos y análisis de texto comprenden una porción significativa de su trabajo del día a día - como se evidencia por CRAN de Natural Language Processing Task View (uno de aproximadamente 20 tales colecciones de paquetes informales orientadas al dominio). Dentro de esa Vista de tareas se encuentra el paquete tm, un paquete dedicado a funciones para minería de textos. Incluido en tm son funciones para tareas de procesamiento optimizado tal como la mencionada en su Q.

Además, R tiene una excelente selección de paquetes para trabajar de forma interactiva en razonablemente grandes conjuntos de datos (por ejemplo,> 1 GB) a menudo sin la necesidad de configurar una infraestructura de procesamiento paralelo (pero que sin duda puede explotar un clúster si está disponible). Los más impresionantes de estos en mi opinión son el conjunto de paquetes bajo la rúbrica "The Bigmemory Project" (CRAN) de Michael Kane y John Emerson en Yale; este proyecto incluye bigmemory, biganalytics, synchronicity, bigtabulate y bigalgebra. En resumen, las técnicas detrás de estos paquetes incluyen: (i) asignar los datos a la memoria compartida, lo que permite la coordinación del acceso compartido por procesos simultáneos separados a una única copia de los datos; (ii) estructuras de datos respaldadas por archivos (que creo, pero no estoy seguro, es sinónimo de una estructura de archivos mapeada en memoria, y que funciona permitiendo un acceso muy rápido desde el disco usando punteros, evitando así el límite de RAM en el tamaño de archivo disponible) .

Aún así, bastantes funciones y estructuras de datos en la biblioteca estándar de R hacen que sea más fácil trabajar de forma interactiva con datos que se aproximan a los límites de RAM normales. Por ejemplo, .RData, un formato binario nativo, es casi tan simple como sea posible usar (los comandos son Guardar y de carga) y tiene una excelente compresión:

> library(ElemStatLearn) 
> data(spam) 
> format(object.size(spam), big.mark=',') 
    [1] "2,344,384" # a 2.34 MB data file 
> save(spam, file='test.RData') 

Este archivo, 'prueba. RData 'es solo 176 KB, mayor que 10 veces compresión.

+0

+1 - ¡excelente respuesta! Aprendí bastantes cosas allí. – Chase

+0

+1 gracias por indicarnos los paquetes 'hash' y' tm' –

3

Esto simplemente no es cierto que R carece de conjuntos, dictados, listas y tuplas; simplemente se implementan como algunas otras estructuras. Por supuesto, el rendimiento puede ser un problema, pero generalmente no es peor que el de Python, y generalmente puede encontrar un paquete que tenga la solución codificada como un eficiente código C.

No sé mucho sobre minería de textos, pero el paquete tm puede contener lo que usted desea.

2

Debería mirar el Natural Language Processing Task View.

Tema encabezamientos:

Fonética y Speech Processing:
bases de datos léxicas:
palabra clave Extracción y general de manipulación de cadenas:
Procesamiento del Lenguaje Natural:
Cuerda Núcleos:
Minería Texto:

Cuestiones relacionadas