Rの文字列処理関数
をテンプレートにして作成
[
トップ
] [
新規
|
一覧
|
検索
|
最終更新
|
ヘルプ
]
開始行:
SIZE(20){COLOR(magenta){R の文字列処理関数}}
// 間瀬茂 (2004.3.20 スタート)
R の文字列処理関数に付いて解説(ほとんどオンラインヘルプそのもの)します。これらは、文字列データの処理、データラベル、
出力・グラフィックス用の文字列、等に使われます。
~
#contents
~
* 文字ベクトルの一部を取り出す、置き換える COLOR(red){substr, substring} [#i846e199]
-COLOR(magenta){書式}
--COLOR(red){substr(x, start, stop)}
--COLOR(red){substring(text, first, last = 1000000)}
--COLOR(red){substr(x, start, stop) <- value}
--COLOR(red){substring(text, first, last = 1000000) <- value}
-COLOR(magenta){引数}
--COLOR(red){x}, COLOR(red){text} 文字列
--COLOR(red){start}, COLOR(red){first} 整数。置き換えられる最初の文字位置
--COLOR(red){stop}, COLOR(red){last} 整数。置き換えられる最後の文字位置
--COLOR(red){value} 文字ベクトル。必要ならリサイクル使用される
-COLOR(magenta){詳細}
--COLOR(red){substring} は S と互換性があるが、COLOR(red){first} と COLOR(red){last} は
COLOR(red){start} と COLOR(red){stop} に置き換わる。引数がベクトルなら、引数を最長の
それの長さまでサイクリックに拡大する
--抽出の際、もし COLOR(red){start} が文字列の長さより長ければ、COLOR(red){""} が返される
--置き換え関数に対しては、もし COLOR(red){start} が文字列の長さより長ければ、
置き換えは実行されない。もし置き換えられる部分が、置き換え文字列より長ければ、
文字列の長さの分だけ置き換えられる
-COLOR(magenta){返り値}
--COLOR(red){substr} に対しては COLOR(red){x} と同じ長さの文字ベクトル
--COLOR(red){substring} に対しては引数の最大長の長さの文字ベクトル
-COLOR(magenta){注意}
-COLOR(red){substring <- } のS4版は COLOR(red){last} を無視する。
このバージョンは無視しない
-COLOR(magenta){例}
> 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"
///////////////////////////////////////////////////////////////////
* 文字列ベクトルの要素を与えられたパターンにしたがって分解 COLOR(red){strsplit} [#ada1a0d7]
-COLOR(magenta){用法}
--COLOR(red){strsplit(x, split, extended = TRUE)}
-COLOR(magenta){引数}
--COLOR(red){x} 分解されるべき文字列
--COLOR(red){split} 分解パターンを指示するCOLOR(blue){正規表現}。
もしマッチするものが無い、特に COLOR(red){split} が長さゼロ、ならば COLOR(red){x} は
個々の文字に分解される。もし COLOR(red){split} の長さが1以上なら、COLOR(red){x} に
対してサイクリックに適用される
--COLOR(red){extended} 論理値。もし COLOR(red){TRUE} なら拡張正規表現によるマッチングが行われ、
またもし COLOR(red){FALSE} なら基本正規表現が使われる
-COLOR(magenta){詳細}
--引数 COLOR(red){x} と COLOR(red){split} は文字列に強制変換される。したがって、
COLOR(red){split=NULL} は COLOR(red){split=character(0)} を意味する
--個々の文字への分解は COLOR(red){split=character(0)} や COLOR(red){split=""} で実行できる。前者がより効率的である
-COLOR(magenta){返り値}
-長さ COLOR(red){length(x)} のリストで、COLOR(red){i} 番目の要素は COLOR(red){x[i]} の分解を含む
-COLOR(magenta){関連事項}
-逆の操作は COLOR(red){paste}。文字列検索と操作は COLOR(red){grep} と COLOR(red){sub} ([[R における正規表現]] を参照)
-COLOR(magenta){例}
# 個々の文字への分解 (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"
///////////////////////////////////////////////////////
* 文字列(への変換と)の結合 COLOR(red){paste} [#e9087412]
-COLOR(magenta){用法} COLOR(red){paste(..., sep = " ", collapse = NULL)}
-COLOR(magenta){引数}
--COLOR(red){...} 一つ以上の R オブジェクト。文字ベクトルに連結される
--COLOR(red){sep} 項目を分離する文字列
--COLOR(red){collapse} 結果を分離するオプションの文字列
-COLOR(magenta){詳細}
--COLOR(red){paste} はその引数を文字列に変換し、そしてそれらを連結する
(COLOR(red){sep} で与えられる文字列で分離し)。もし引数がベクトルなら
項目毎に連結され一つの文字ベクトルを与える。
--もし COLOR(red){collapse} が与えられると、結果は COLOR(red){collapse}
の値で分離された単一の文字列に連結される
-COLOR(magenta){返り値}
--連結された値からなる文字ベクトル。したがって、COLOR(red){collapse} が
与えられない限り、全てのオブジェクトが長さゼロなら結果も長さはゼロになる
(COLOR(red){collapse} が与えられたときは空の文字列になる)。
-COLOR(magenta){例}
> 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=""))
&ref(paste1.png);
/////////////////////////////////////
*文字数を数える COLOR(red){nchar} [#e2b1eff3]
COLOR(red){nchar} は文字ベクトル COLOR(red){x} を引数に取り、
その要素中の文字数からなるベクトルを返す
-COLOR(magenta){用法} COLOR(red){nchar(x)}
-COLOR(magenta){引数}
--COLOR(red){x} 文字ベクトル、もしくは文字ベクトルに強制変換されるベクトル
-COLOR(magenta){詳細}
--内部的に COLOR(red){as.character} と同値な操作が COLOR(red){x} に
行われる。もしベクトルでないオブジェクトの場合は、まず COLOR(red){deparse}
を行う必要がある
-COLOR(magenta){返り値}
--文字数が文字列として出力される(欠損文字列には整数 COLOR(red){2})
-COLOR(magenta){関連事項}
--COLOR(red){strwidth} はプロット用に文字列の幅を与える
-COLOR(magenta){例}
> 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
/////////////////////////////////////////////////////
*文字列の部分的マッチング COLOR(red){charmatch} [#b71cbd6d]
COLOR(red){charmatch} は、その第一引数の要素にマッチするものを、第二引数の中から探す
-COLOR(magenta){用法} COLOR(red){charmatch(x, table, nomatch = NA)}
-COLOR(magenta){引数}
--COLOR(red){x} マッチされる対象(複数可)
--COLOR(red){table} マッチが調べられる文字列ベクトル
--COLOR(red){nomatch} マッチングが無い箇所で返される値
-COLOR(magenta){詳細}
--正確なマッチが一部だけのマッチより優先される(つまり、ターゲットの先頭部分に
値が正確にマッチし、更にターゲットのほうがより長いケース)。
--もし正確なマッチングが一ヶ所だけ、皆無、ユニークな部分的なマッチがあれば、
マッチ箇所の添字が返される。もし複数の正確なマッチ、もしくは部分的マッチが
あれば COLOR(red){0} が返され、マッチが皆無なら COLOR(red){NA} が返される。
-COLOR(magenta){関連事項}
--COLOR(red){pmatch}, COLOR(red){match}. より一般的な(正規表現による)文字列のマッチング
には COLOR(red){grep} や COLOR(red){regexpr}
-COLOR(magenta){例}
> 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番目と正確なマッチ
* 大文字/小文字変換 COLOR(red){toupper, tolower} [#if5d9066]
splus2R パッケージの、upperCase, lowerCase 関数~
今更そんなもの。もともと base には toupper, tolower があります。実行速度もほぼ同じ。~
~
COLOR(red){toupper} は、引数の文字列ベクトルの英小文字を英大文字に変換する。~
COLOR(red){tolower} は、引数の文字列ベクトルの英大文字を英小文字に変換する。
-COLOR(magenta){用法}
--COLOR(red){toupper(x)}
--COLOR(red){tolower(x)}
-COLOR(magenta){引数}
--COLOR(red){x} 文字列ベクトル
-COLOR(magenta){例}
> x <- "MiXeD cAsE 123"
> tolower(x)
[1] "mixed case 123"
> toupper(x)
[1] "MIXED CASE 123"
* 文字変換 COLOR(red){chartr} [#fdaa7bab]
COLOR(red){chartr} は、第3引数の文字列ベクトル中の第1引数の文字を第2引数の文字に変換する。
-COLOR(magenta){用法}
--COLOR(red){chartr(old, new, x)}
-COLOR(magenta){引数}
--COLOR(red){old} 置き換えられる文字列
--COLOR(red){new} 置き換える文字列
--COLOR(red){x} 文字列ベクトル
-COLOR(magenta){例}
> 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] "アイウエオ"
* 文字コード変換 [#rd289b22]
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")
//UTF-8 で出力されて何が不都合なんだろうか?それと,SHIFT-JIS というのは CP932 ではないだろうか?
*参考リンク [#cb180f07]
-[[Working with strings:http://www.r-bloggers.com/working-with-strings/]]
終了行:
SIZE(20){COLOR(magenta){R の文字列処理関数}}
// 間瀬茂 (2004.3.20 スタート)
R の文字列処理関数に付いて解説(ほとんどオンラインヘルプそのもの)します。これらは、文字列データの処理、データラベル、
出力・グラフィックス用の文字列、等に使われます。
~
#contents
~
* 文字ベクトルの一部を取り出す、置き換える COLOR(red){substr, substring} [#i846e199]
-COLOR(magenta){書式}
--COLOR(red){substr(x, start, stop)}
--COLOR(red){substring(text, first, last = 1000000)}
--COLOR(red){substr(x, start, stop) <- value}
--COLOR(red){substring(text, first, last = 1000000) <- value}
-COLOR(magenta){引数}
--COLOR(red){x}, COLOR(red){text} 文字列
--COLOR(red){start}, COLOR(red){first} 整数。置き換えられる最初の文字位置
--COLOR(red){stop}, COLOR(red){last} 整数。置き換えられる最後の文字位置
--COLOR(red){value} 文字ベクトル。必要ならリサイクル使用される
-COLOR(magenta){詳細}
--COLOR(red){substring} は S と互換性があるが、COLOR(red){first} と COLOR(red){last} は
COLOR(red){start} と COLOR(red){stop} に置き換わる。引数がベクトルなら、引数を最長の
それの長さまでサイクリックに拡大する
--抽出の際、もし COLOR(red){start} が文字列の長さより長ければ、COLOR(red){""} が返される
--置き換え関数に対しては、もし COLOR(red){start} が文字列の長さより長ければ、
置き換えは実行されない。もし置き換えられる部分が、置き換え文字列より長ければ、
文字列の長さの分だけ置き換えられる
-COLOR(magenta){返り値}
--COLOR(red){substr} に対しては COLOR(red){x} と同じ長さの文字ベクトル
--COLOR(red){substring} に対しては引数の最大長の長さの文字ベクトル
-COLOR(magenta){注意}
-COLOR(red){substring <- } のS4版は COLOR(red){last} を無視する。
このバージョンは無視しない
-COLOR(magenta){例}
> 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"
///////////////////////////////////////////////////////////////////
* 文字列ベクトルの要素を与えられたパターンにしたがって分解 COLOR(red){strsplit} [#ada1a0d7]
-COLOR(magenta){用法}
--COLOR(red){strsplit(x, split, extended = TRUE)}
-COLOR(magenta){引数}
--COLOR(red){x} 分解されるべき文字列
--COLOR(red){split} 分解パターンを指示するCOLOR(blue){正規表現}。
もしマッチするものが無い、特に COLOR(red){split} が長さゼロ、ならば COLOR(red){x} は
個々の文字に分解される。もし COLOR(red){split} の長さが1以上なら、COLOR(red){x} に
対してサイクリックに適用される
--COLOR(red){extended} 論理値。もし COLOR(red){TRUE} なら拡張正規表現によるマッチングが行われ、
またもし COLOR(red){FALSE} なら基本正規表現が使われる
-COLOR(magenta){詳細}
--引数 COLOR(red){x} と COLOR(red){split} は文字列に強制変換される。したがって、
COLOR(red){split=NULL} は COLOR(red){split=character(0)} を意味する
--個々の文字への分解は COLOR(red){split=character(0)} や COLOR(red){split=""} で実行できる。前者がより効率的である
-COLOR(magenta){返り値}
-長さ COLOR(red){length(x)} のリストで、COLOR(red){i} 番目の要素は COLOR(red){x[i]} の分解を含む
-COLOR(magenta){関連事項}
-逆の操作は COLOR(red){paste}。文字列検索と操作は COLOR(red){grep} と COLOR(red){sub} ([[R における正規表現]] を参照)
-COLOR(magenta){例}
# 個々の文字への分解 (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"
///////////////////////////////////////////////////////
* 文字列(への変換と)の結合 COLOR(red){paste} [#e9087412]
-COLOR(magenta){用法} COLOR(red){paste(..., sep = " ", collapse = NULL)}
-COLOR(magenta){引数}
--COLOR(red){...} 一つ以上の R オブジェクト。文字ベクトルに連結される
--COLOR(red){sep} 項目を分離する文字列
--COLOR(red){collapse} 結果を分離するオプションの文字列
-COLOR(magenta){詳細}
--COLOR(red){paste} はその引数を文字列に変換し、そしてそれらを連結する
(COLOR(red){sep} で与えられる文字列で分離し)。もし引数がベクトルなら
項目毎に連結され一つの文字ベクトルを与える。
--もし COLOR(red){collapse} が与えられると、結果は COLOR(red){collapse}
の値で分離された単一の文字列に連結される
-COLOR(magenta){返り値}
--連結された値からなる文字ベクトル。したがって、COLOR(red){collapse} が
与えられない限り、全てのオブジェクトが長さゼロなら結果も長さはゼロになる
(COLOR(red){collapse} が与えられたときは空の文字列になる)。
-COLOR(magenta){例}
> 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=""))
&ref(paste1.png);
/////////////////////////////////////
*文字数を数える COLOR(red){nchar} [#e2b1eff3]
COLOR(red){nchar} は文字ベクトル COLOR(red){x} を引数に取り、
その要素中の文字数からなるベクトルを返す
-COLOR(magenta){用法} COLOR(red){nchar(x)}
-COLOR(magenta){引数}
--COLOR(red){x} 文字ベクトル、もしくは文字ベクトルに強制変換されるベクトル
-COLOR(magenta){詳細}
--内部的に COLOR(red){as.character} と同値な操作が COLOR(red){x} に
行われる。もしベクトルでないオブジェクトの場合は、まず COLOR(red){deparse}
を行う必要がある
-COLOR(magenta){返り値}
--文字数が文字列として出力される(欠損文字列には整数 COLOR(red){2})
-COLOR(magenta){関連事項}
--COLOR(red){strwidth} はプロット用に文字列の幅を与える
-COLOR(magenta){例}
> 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
/////////////////////////////////////////////////////
*文字列の部分的マッチング COLOR(red){charmatch} [#b71cbd6d]
COLOR(red){charmatch} は、その第一引数の要素にマッチするものを、第二引数の中から探す
-COLOR(magenta){用法} COLOR(red){charmatch(x, table, nomatch = NA)}
-COLOR(magenta){引数}
--COLOR(red){x} マッチされる対象(複数可)
--COLOR(red){table} マッチが調べられる文字列ベクトル
--COLOR(red){nomatch} マッチングが無い箇所で返される値
-COLOR(magenta){詳細}
--正確なマッチが一部だけのマッチより優先される(つまり、ターゲットの先頭部分に
値が正確にマッチし、更にターゲットのほうがより長いケース)。
--もし正確なマッチングが一ヶ所だけ、皆無、ユニークな部分的なマッチがあれば、
マッチ箇所の添字が返される。もし複数の正確なマッチ、もしくは部分的マッチが
あれば COLOR(red){0} が返され、マッチが皆無なら COLOR(red){NA} が返される。
-COLOR(magenta){関連事項}
--COLOR(red){pmatch}, COLOR(red){match}. より一般的な(正規表現による)文字列のマッチング
には COLOR(red){grep} や COLOR(red){regexpr}
-COLOR(magenta){例}
> 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番目と正確なマッチ
* 大文字/小文字変換 COLOR(red){toupper, tolower} [#if5d9066]
splus2R パッケージの、upperCase, lowerCase 関数~
今更そんなもの。もともと base には toupper, tolower があります。実行速度もほぼ同じ。~
~
COLOR(red){toupper} は、引数の文字列ベクトルの英小文字を英大文字に変換する。~
COLOR(red){tolower} は、引数の文字列ベクトルの英大文字を英小文字に変換する。
-COLOR(magenta){用法}
--COLOR(red){toupper(x)}
--COLOR(red){tolower(x)}
-COLOR(magenta){引数}
--COLOR(red){x} 文字列ベクトル
-COLOR(magenta){例}
> x <- "MiXeD cAsE 123"
> tolower(x)
[1] "mixed case 123"
> toupper(x)
[1] "MIXED CASE 123"
* 文字変換 COLOR(red){chartr} [#fdaa7bab]
COLOR(red){chartr} は、第3引数の文字列ベクトル中の第1引数の文字を第2引数の文字に変換する。
-COLOR(magenta){用法}
--COLOR(red){chartr(old, new, x)}
-COLOR(magenta){引数}
--COLOR(red){old} 置き換えられる文字列
--COLOR(red){new} 置き換える文字列
--COLOR(red){x} 文字列ベクトル
-COLOR(magenta){例}
> 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] "アイウエオ"
* 文字コード変換 [#rd289b22]
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")
//UTF-8 で出力されて何が不都合なんだろうか?それと,SHIFT-JIS というのは CP932 ではないだろうか?
*参考リンク [#cb180f07]
-[[Working with strings:http://www.r-bloggers.com/working-with-strings/]]
ページ名: