R作为通用编程语言

问题描述:

我之前喜欢Python,因为Python拥有丰富的内置类型,比如集合,字典,列表,元组等。这些结构有助于编写短脚本来处理数据。另一方面,R像Matlab一样,并且具有标量,矢量,数据框,数组和列表作为其数据类型。但它缺乏集合,字典,元组等。我知道列表类型是强大的,很多操作可以被认为是列表处理。但是将R用作通用语言的想法仍然是模糊的。R作为通用编程语言

(以下只是一个例子。不是说我专注于文本处理/挖掘。)

例如,我需要做的TF-IDF统计的一组新闻文章(说20万文件夹中的文章及其子文件夹)。

读完文件后,我需要做字对ID映射和其他计数任务。这些任务涉及字符串操作,需要像set或map这样的容器。

我知道我可以使用另一种语言来完成这些处理并将数据加载到R.但是,对于小事情,将所有预处理放入单个R脚本中可能会更好。

所以我的问题是R在语言层面有足够的能力来处理这种丰富的数据结构吗?或者如果没有,任何软件包都能为R语言提供很好的扩展?

+1

这不是直接回答你的问题,但你知道像rpy2这样的东西?它允许您将Python对象转换为R对象并在其上使用R函数。因此,您可以在相同的脚本中执行Python处理,然后执行R处理,尽管语法略长。 – 2010-12-02 11:11:08

+0

@Thomas不是一个解决方案。我担心的是我想要坚持使用R,尽可能少使用外部的东西。特别是当我给出我的代码时,如果最终用户只需要安装R,则会更好。 – 2010-12-02 11:20:14

我认为R的数据预处理能力 - 即从数据源中提取数据并在分析步骤之前的所有内容 - 都得到了改进基本上在过去的三年里(我一直使用R的时间)。我每天都在使用python并且在过去七年左右 - 它的文本处理能力非常出色 - 我仍然会毫不犹豫地用R来提供您所提到的任务类型。

虽然有一些附带条件。首先,我建议非常密切的一对夫妇的外部包设定在您的问与答任务的期待 - 特别是哈希(蟒蛇般的键值数据结构),以及stringr(包括主要的过在基座库中的较少用户友好的字符串操作函数的包装)

两个stringr散列可在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" 

似乎也有对他们来说,文本处理和文本分析包括他们每天的日常工作的显著部分R用户的相当大的一部分 - 由CRAN的Natural Language Processing Task View(一个约20证明这种非正式的面向领域的软件包集合)。该任务视图中包含tm包,这是一个专门用于文本挖掘功能的包。包括在TM被优化用于处理任务的功能,如在Q.

另外提到的一个,R具有封装的极好的选择用于在相当大的数据集交互工作(例如,> 1 GB)通常不需要建立并行处理基础设施(但是如果可用的话,它肯定会利用集群)。在我看来,最令人印象深刻的是Michael Kane和John Emerson在耶鲁的标题“The Bigmemory Project”(CRAN)下的一套包装;本项目包含大内存,biganalytics,同步性,bigtabulate和bigalgebra。总而言之,这些软件包背后的技术包括:(i)将数据分配给共享内存,使共享访问能够通过单独的并发进程协调一份数据; (ii)文件支持的数据结构(我相信,但我不确定,它与内存映射文件结构是同义词,它能够使用指针从磁盘进行非常快速的访问,从而避免RAM限制可用文件大小) 。

尽管如此,R标准库中的很多函数和数据结构仍然可以更轻松地与接近普通RAM限制的数据交互工作。例如,.RData,本机二进制格式,大约是尽可能简单使用(命令是节省负载),并且它具有优异的压缩:

> 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') 

此文件,“测试。 RData'仅为176 KB,大于10倍压缩。

这不正确,R缺乏集合,字典,列表和元组;它们只是作为一些其他结构来实施。当然,性能可能是一个问题,但通常情况下它不会比Python差,并且通常可以找到一个将解决方案编码为高效C代码的包。

我对文本挖掘知之甚少,但tm包可能包含您想要的内容。

你应该看看Natural Language Processing Task View

主题标题:

语音和语音处理:
词汇数据库:
关键词提取和通用字符串操作:
自然语言处理:
字符串核函数:
文本挖掘: