R の文字列処理関数

R の文字列処理関数に付いて解説(ほとんどオンラインヘルプそのもの)します。これらは、文字列データの処理、データラベル、 出力・グラフィックス用の文字列、等に使われます。


文字ベクトルの一部を取り出す、置き換える substr, substring

  • 書式
    • substr(x, start, stop)
    • substring(text, first, last = 1000000)
    • substr(x, start, stop) <- value
    • substring(text, first, last = 1000000) <- value
  • 引数
    • x, text 文字列
    • start, first 整数。置き換えられる最初の文字位置
    • stop, last 整数。置き換えられる最後の文字位置
    • value 文字ベクトル。必要ならリサイクル使用される
  • 詳細
    • substring は S と互換性があるが、firstlaststartstop に置き換わる。引数がベクトルなら、引数を最長の それの長さまでサイクリックに拡大する
    • 抽出の際、もし start が文字列の長さより長ければ、"" が返される
    • 置き換え関数に対しては、もし start が文字列の長さより長ければ、 置き換えは実行されない。もし置き換えられる部分が、置き換え文字列より長ければ、 文字列の長さの分だけ置き換えられる
  • 返り値
    • substr に対しては x と同じ長さの文字ベクトル
    • substring に対しては引数の最大長の長さの文字ベクトル
  • 注意
  • substring <- のS4版は last を無視する。 このバージョンは無視しない
  • > substr("abcdef",2,4)  # "abcdef" の2番目から4番目の部分
    [1] "bcd"
    > substring("abcdef",1:6,1:6) # 文字列を構成文字に分解(strsplit がより効率的)
    [1] "a" "b" "c" "d" "e" "f"
    
    > substr(rep("abcdef",4),1:4, 4:5) # "abcdef" の 1-4, 2-5, 3-4, 4-5 文字目を取り出す
    [1] "abcd" "bcde" "cd"   "de"
    
    > x <- c("asfef", "qwerty", "yuiop[", "b", "stuff.blah.yech") # 文字列ベクトル
    > substr(x, 2, 5)                          # 各々の文字列の 2-5 文字目を取り出す            
    [1] "sfef" "wert" "uiop" ""     "tuff"
    > substring(x, 2, 4:6)   # 各々の文字列の 2-4, 2-5, 2-6 文字目を取り出す            
    [1] "sfe"   "wert"  "uiop[" ""      "tuff"
    > substring(x, 2) <- c("..", "+++")  # 各文字列の2文字目以降を "..", "+++" で(交互に)置き換え。
    >      x                             # "b" は短すぎるので何も置き換わらない
    [1] "a..ef"           "q+++ty"          "y..op["          "b"
    [5] "s..ff.blah.yech"

文字列ベクトルの要素を与えられたパターンにしたがって分解 strsplit

  • 用法
    • strsplit(x, split, extended = TRUE)
  • 引数
    • x 分解されるべき文字列
    • split 分解パターンを指示する正規表現。 もしマッチするものが無い、特に split が長さゼロ、ならば x は 個々の文字に分解される。もし split の長さが1以上なら、x に 対してサイクリックに適用される
    • extended 論理値。もし TRUE なら拡張正規表現によるマッチングが行われ、 またもし FALSE なら基本正規表現が使われる
  • 詳細
    • 引数 xsplit は文字列に強制変換される。したがって、 split=NULLsplit=character(0) を意味する
    • 個々の文字への分解は split=character(0)split="" で実行できる。前者がより効率的である
  • 返り値
  • 長さ length(x) のリストで、i 番目の要素は x[i] の分解を含む
  • # 個々の文字への分解 (noquote は引用記号無しに出力する関数)
    > noquote(strsplit("A text I want to display with spaces", NULL)[[1]])
    [1] A   t e x t   I   w a n t   t o   d i s p l a y   w i t h   s p a c e s
    
    > x <- c(as = "asfef", qu = "qwerty", "yuiop[", "b", "stuff.blah.yech") # 文字列ベクトル
    > strsplit(x,"e")  " 文字 "e" で分解 (文字 "e" は消える)
    $as
    [1] "asf" "f"
    $qu
    [1] "qw"  "rty"
    [[3]]
    [1] "yuiop["
    [[4]]
    [1] "b"
    [[5]]
    [1] "stuff.blah.y" "ch"
    
    > unlist(strsplit("a.b.c", ".")) # 正規表現 "." は任意の単一文字にマッチ
    [1] "" "" "" "" ""
    > unlist(strsplit("a.b.c", "\\.")) # 文字ピリオッド "." で分割
    [1] "a" "b" "c"
    
    # 文字列の逆転関数 rev() を併用した例
    # 文字列ベクトル x の各要素を個々の文字に分解したリストに変換し、各々逆転
    # 次にそれらを paste 関数でつなぐ(sapply の引数はリスト、返り値はベクトル)
    > strReverse <- function(x)
                      sapply(lapply(strsplit(x,NULL), rev), paste, collapse="")
    > strReverse(c("abc", "Statistics"))
    [1] "cba"        "scitsitatS"
    
    # R-core メンバーの first name を得る
    > a <- readLines(file.path(R.home(),"AUTHORS"))[-(1:8)] # 最初の8要素(前置き)を除く
    > a
     [1] "Douglas Bates\t\t<bates@stat.wisc.edu>"
     [2] "John Chambers\t\t<jmc@research.bell-labs.com>"
     [3] "Peter Dalgaard\t\t<p.dalgaard@biostat.ku.dk>"
     [4] "Robert Gentleman\t<rgentlem@jimmy.dfci.harvard.edu>"
     [5] "Kurt Hornik\t\t<Kurt.Hornik@ci.tuwien.ac.at>"
     [6] "Stefano Iacus\t\t<stefano.iacus@unimi.it>"
     [7] "Ross Ihaka\t\t<ihaka@stat.auckland.ac.nz>"
     [8] "Friedrich Leisch\t<Friedrich.Leisch@univie.ac.at>"
     [9] "Thomas Lumley\t\t<tlumley@u.washington.edu>"
    [10] "Martin Maechler\t\t<maechler@stat.math.ethz.ch>"
    [11] "Duncan Murdoch\t\t<murdoch@stats.uwo.ca>"
    [12] "Paul Murrell\t\t<paul@stat.auckland.ac.nz>"
    [13] "Martyn Plummer\t\t<plummer@iarc.fr>"
    [14] "Brian Ripley\t\t<ripley@stats.ox.ac.uk>"
    [15] "Duncan Temple Lang\t<duncan@research.bell-labs.com>"
    [16] "Luke Tierney\t\t<luke@stat.umn.edu>"
    [17] ""
    [18] "plus Heiner Schwarte <h.schwarte@bluewin.ch> up to October 1999"
    [19] "and Guido Masarotto <guido@hal.stat.unipd.it> up to June 2003."
    > a <- a[(0:2)-length(a)] # 現メンバーだけ取り出す
    # 正規表現 " .*" は「空白の後に任意一文字の任意繰返し」の意味で、結局「(最初の)空白以降すべて」を意味する
    > (a <- sub(" .*","", a)) # 最初の空白以降を取り去る(空文字で置き換える)
     [1] "Douglas"   "John"      "Peter"     "Robert"    "Kurt"      "Stefano"
     [7] "Ross"      "Friedrich" "Thomas"    "Martin"    "Duncan"    "Paul"
    [13] "Martyn"    "Brian"     "Duncan"    "Luke"

文字列(への変換と)の結合 paste

  • 用法 paste(..., sep = " ", collapse = NULL)
  • 引数
    • ... 一つ以上の R オブジェクト。文字ベクトルに連結される
    • sep 項目を分離する文字列
    • collapse 結果を分離するオプションの文字列
  • 詳細
    • paste はその引数を文字列に変換し、そしてそれらを連結する (sep で与えられる文字列で分離し)。もし引数がベクトルなら 項目毎に連結され一つの文字ベクトルを与える。
    • もし collapse が与えられると、結果は collapse の値で分離された単一の文字列に連結される
  • 返り値
    • 連結された値からなる文字ベクトル。したがって、collapse が 与えられない限り、全てのオブジェクトが長さゼロなら結果も長さはゼロになる (collapse が与えられたときは空の文字列になる)。
  • > paste(1:12) # as.character(1:12) と同じ
     [1] "1"  "2"  "3"  "4"  "5"  "6"  "7"  "8"  "9"  "10" "11" "12"
    > paste("A", 1:6, sep = "") # "A" がリサイクル使用される
    [1] "A1" "A2" "A3" "A4" "A5" "A6"
    >      paste("A", 1:6)      # sep="" を指定しないと空白が挿入される
    [1] "A 1" "A 2" "A 3" "A 4" "A 5" "A 6"
    
    # collapse の使用例。結果は単一の文字列になる
    >      paste("A", 1:6, sep="",collapse="|")
    [1] "A1|A2|A3|A4|A5|A6"
    > paste("A", 1:6, sep="",collapse=" ")
    [1] "A1 A2 A3 A4 A5 A6"
    
    > paste("Today is", date()) # date()  関数の出力文字列と連結
    [1] "Today is Sat Mar 20 17:22:23 2004"
    
    # 数値は文字列に変換後連結される(グラフィックスラベル等に重宝)
    > x <- pi 
    > paste("pi =", x)
    [1] "pi = 3.14159265358979"
    
    > k=10; x=1:k; y=runif(k)
    > plot(x,y,xlab=paste("x values are 1:", k, sep=""), 
           ylab=paste("y values are runif(", k, ")", sep=""))
    paste1.png

文字数を数える nchar

nchar は文字ベクトル x を引数に取り、 その要素中の文字数からなるベクトルを返す

  • 用法 nchar(x)
  • 引数
    • x 文字ベクトル、もしくは文字ベクトルに強制変換されるベクトル
  • 詳細
    • 内部的に as.character と同値な操作が x に 行われる。もしベクトルでないオブジェクトの場合は、まず deparse を行う必要がある
  • 返り値
    • 文字数が文字列として出力される(欠損文字列には整数 2)
  • 関連事項
    • strwidth はプロット用に文字列の幅を与える
  • > x <- c("asfef","qwerty","yuiop[","b","stuff.blah.yech")
    > nchar(x)
    [1]  5  6  6  1 15
    
    > mean   # 平均値関数 mean の定義(内部関数)
    function (x, ...)
    UseMethod("mean")
    <environment: namespace:base>
    > deparse(mean)
    [1] "function (x, ...) "  "UseMethod(\"mean\")"
    > nchar(deparse(mean))
    [1] 18 17
    
    > nchar("")
    [1] 0
    > nchar(NULL)
    numeric(0)
    > nchar(NA)
    [1] 2

文字列の部分的マッチング charmatch

charmatch は、その第一引数の要素にマッチするものを、第二引数の中から探す

  • 用法 charmatch(x, table, nomatch = NA)
  • 引数
    • x マッチされる対象(複数可)
    • table マッチが調べられる文字列ベクトル
    • nomatch マッチングが無い箇所で返される値
  • 詳細
    • 正確なマッチが一部だけのマッチより優先される(つまり、ターゲットの先頭部分に 値が正確にマッチし、更にターゲットのほうがより長いケース)。
    • もし正確なマッチングが一ヶ所だけ、皆無、ユニークな部分的なマッチがあれば、 マッチ箇所の添字が返される。もし複数の正確なマッチ、もしくは部分的マッチが あれば 0 が返され、マッチが皆無なら NA が返される。
  • 関連事項
    • pmatch, match. より一般的な(正規表現による)文字列のマッチング には grepregexpr
  • > charmatch("", "") 
    [1] 1                 # 空文字列の正確なマッチ
    > charmatch("m",   c("mean", "median", "mode"))
    [1] 0                 # 複数のマッチ
    > charmatch("me", c("mean", "median", "mode"))
    [1] 0                 # 複数のマッチ
    > charmatch("med", c("mean", "median", "mode")) 
    [1] 2                 # ターゲットの2番目と正確なマッチ
    > charmatch(c("med","mo"), c("mean", "median", "mode"))
    [1] 2 3               # ターゲットの2,3番目と正確なマッチ

大文字/小文字変換 toupper, tolower

splus2R パッケージの、upperCase, lowerCase 関数
今更そんなもの。もともと base には toupper, tolower があります。実行速度もほぼ同じ。

toupper は、引数の文字列ベクトルの英小文字を英大文字に変換する。
tolower は、引数の文字列ベクトルの英大文字を英小文字に変換する。

  • 用法
    • toupper(x)
    • tolower(x)
  • 引数
    • x 文字列ベクトル
  • > x <- "MiXeD cAsE 123"
    > tolower(x)
    [1] "mixed case 123"
    > toupper(x)
    [1] "MIXED CASE 123"

文字変換 chartr

chartr は、第3引数の文字列ベクトル中の第1引数の文字を第2引数の文字に変換する。

  • 用法
    • chartr(old, new, x)
  • 引数
    • old 置き換えられる文字列
    • new 置き換える文字列
    • x 文字列ベクトル
  • > x <- "MiXeD cAsE 123"
    > chartr("a-z", "A-Z", x) # toupper と同じ結果になる
    [1] "MIXED CASE 123"
    > chartr("A-Z", "a-z", x) # tolower と同じ結果になる
    [1] "mixed case 123"
    > chartr("A-Z1-3", "a-z4-6", x) # 数字も置き換えることができる
    [1] "mixed case 456"
    > x <- "MiXeD cAsE 123@#"
    > chartr("A-Z1-3@#", "a-z4-6%$", x) # 当然,記号も置き換えることができる
    [1] "mixed case 456%$"
    > chartr(" !-~", "!-~ ", "This is a pen.") # 単純な暗号
    [1] "Uijt!jt!b!qfo/"
    > chartr("あ-ん", "ア-ン", "あいうえお") # Windows でもできるかな?
    [1] "アイウエオ"

文字コード変換

 Windows 上で、日本語を含む文字列を処理した際に、そのままではwrite.dbf を実行すると、UTF-8 で出力されてしまう。このため iconv 関数を利用して以下のようにする必要がある。

library(foreign)
dbf <- read.dbf("test.dbf")
jchars <- gsub(" ","",chartr("$役所","  ",as.character(as.vector(dbf$textfield))))
dbf$textfield <- iconv(jchars,'UTF-8','SHIFT_JIS')
write.dbf(dbf,"testnew.dbf")

参考リンク


添付ファイル: filepaste1.png 941件 [詳細]

トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Google
WWW を検索 OKADAJP.ORG を検索
Last-modified: 2015-03-01 (日) 01:15:59 (1422d)