星期二, 二月 28, 2012

R语言编程入门之四:字符串处理


尽管R语言的主要处理对象是数字,而字符串有时候也会在数据分析中占到相当大的份量。特别是在文本数据挖掘日趋重要的背景下,在数据预处理阶段你需要熟练的操作字符串对象。当然如果你擅长其它的处理软件,比如Python,可以让它来负责前期的脏活。

获取字符串长度:nchar()能够获取字符串的长度,它也支持字符串向量操作。注意它和length()的结果是有区别的。

字符串粘合:paste()负责将若干个字符串相连结,返回成单独的字符串。其优点在于,就算有的处理对象不是字符型也能自动转为字符型。

字符串分割:strsplit()负责将字符串按照某种分割形式将其进行划分,它正是paste()的逆操作。

字符串截取:substr()能对给定的字符串对象取出子集,其参数是子集所处的起始和终止位置。

字符串替代:gsub()负责搜索字符串的特定表达式,并用新的内容加以替代。sub()函数是类似的,但只替代第一个发现结果。

字符串匹配:grep()负责搜索给定字符串对象中特定表达式 ,并返回其位置索引。grepl()函数与之类似,但其后面的"l"则意味着返回的将是逻辑值。

一个例子:
我们来看一个处理邮件的例子,目的是从该文本中抽取发件人的地址。该文本在此可以下载到。邮件的全文如下所示:
----------------------------
Return-Path: skip@pobox.com
Delivery-Date: Sat Sep  7 05:46:01 2002
From: skip@pobox.com (Skip Montanaro)
Date: Fri, 6 Sep 2002 23:46:01 -0500
Subject: [Spambayes] speed
Message-ID: <15737.33929.716821.779152@12-248-11-90.client.attbi.com>

If the frequency of my laptop's disk chirps are any indication, I'd say
hammie is about 3-5x faster than SpamAssassin.

Skip
----------------------------
# 用readLines函数从本地文件中读取邮件全文。
data <- readLines('data')  
# 判断对象的类,确定是一个文本型向量,每行文本是向量的一个元素。
class(data)  
# 从这个文本向量中找到包括有"From:"字符串的那一行
email <- data[grepl('From:',data)] 
#将其按照空格进行分割,分成一个包括四个元素的字符串向量。
from <- strsplit(email,' ')
# 上面的结果是一个list格式,转成向量格式。
from <- unlist(from) 
# 最后搜索包含'@'的元素,即为发件人邮件地址。
from <- from[grepl('@',from)] 
在字符串的复杂操作中通常会包括正则表达式(Regular Expressions),关于这方面内容可以参考?regex

3 条评论:

  1. 才发现代码里面的 readLines data...都有超链接的。太任性了。谢谢博主!实战的代码很受启发。

    回复删除
  2. > grepl('From:',data)
    [1] FALSE FALSE TRUE FALSE FALSE FALSE FALSE
    [8] FALSE FALSE FALSE FALSE FALSE FALSE FALSE


    data[grepl('From:',data)] 能返回正确的一行

    这是什么原理啊?


    回复删除