R作为通用编程语言

Yin*_*Zhu 14 python wiki language-features r

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

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

(以下只是一个例子.并不意味着我专注于文本处理/挖掘.)

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

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

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

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

dou*_*oug 21

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

但是有几个附带条件.首先,我建议您仔细查看Q中的一组任务的外部包 - 特别是散列(类似于python的键值数据结构)和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"
Run Code Online (Sandbox Code Playgroud)

似乎还有一大部分R用户,他们的文本处理和文本分析构成了他们日常工作的重要部分 - 正如CRAN的自然语言处理任务视图(约20个这样的非正式域名之一)所证明的那样面向方向的包集合).在该任务视图中是包tm,一个专用于文本挖掘功能的包.包含在tm中的是用于处理任务的优化函数,例如Q中提到的任务.

此外,R还具有出色的数据包选择,可以在相当大的数据集(例如,> 1 GB)上进行交互式工作,而无需建立并行处理基础架构(但如果可用,它肯定可以利用集群).在我看来,其中最令人印象深刻的是" The Bigmemory Project "下的一系列包"(CRAN)由迈克尔凯恩和约翰爱默生在耶鲁大学;该项目包含大记忆,大分析,同步,大型和大型代数.总之,这些软件包背后的技术包括:(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')
Run Code Online (Sandbox Code Playgroud)

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