R作为通用编程语言

时间:2010-12-02 08:37:00

标签: python r wiki language-features

之前我喜欢Python,因为Python有丰富的内置类型,如集合,dicts,列表,元组。这些结构有助于编写简短的脚本来处理数据。

另一方面,R就像Matlab一样,并且有标量,向量,数据帧,数组和列表作为其数据类型。但是它缺少set,dicts,tuples等。我知道列表类型很强大,很多操作都可以被认为是列表处理。但是使用R作为通用语言的想法仍然模糊不清。

(以下只是示例。并不意味着我专注于文本处理/挖掘。)

例如,我需要为一组新闻文章(例如文件夹及其子文件夹中的200,000篇文章)进行TF-IDF计数。

读完文件后,我需要进行word-to-ID映射和其他计数任务。这些任务涉及字符串操作和需要容器,如set或map。

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

所以我的问题是R在语言级别的这种丰富的数据结构中是否具有足够的能力?或者如果没有,任何包都为R语言提供了良好的扩展?

3 个答案:

答案 0 :(得分:21)

我认为R的数据预处理能力 - 即从源头提取数据和在分析步骤之前的所有内容 - 在过去三年中已大幅改善(我使用R的时间长度) 。我每天使用python并且在过去的七年左右 - 它的文本处理能力非常出色 - 我仍然会毫不犹豫地将R用于您提到的任务类型。

但有几个附带条件。首先,我建议您仔细查看Q中的一组外部包 - 特别是 哈希 (类似于python的键值数据结构)和 stringr (主要由基础库中用户友好的字符串操作函数的包装器组成)

CRAN上提供 stringr 哈希

> 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)上进行交互式工作,而无需设置并行处理基础架构(但如果可用,它肯定可以利用集群) )。在我看来,其中最令人印象深刻的是由迈克尔凯恩和约翰艾默生在耶鲁大学的标题“The Bigmemory Project”(CRAN)下的套装;这个项目包含bigmemory,biganalytics,synchronicity,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')

此文件'test.RData'仅 176 KB ,大​​于 10倍压缩。

答案 1 :(得分:3)

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

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

答案 2 :(得分:2)

您应该查看Natural Language Processing Task View

主题标题:

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

相关问题