Google
WWWを検索
サイト内を検索

1 文字列の連結

対応する順番のベクトルの要素とベクトルの要素を-を挟んで連結します。

(person <- c("Noah", "William", "Frida", "Olivia"))
[1] "Noah"    "William" "Frida"   "Olivia" 
(number <- 1:length(person))
[1] 1 2 3 4
(s <- paste(person, number, sep = "-"))
[1] "Noah-1"    "William-2" "Frida-3"   "Olivia-4" 

ベクトルのすべての要素を,を挟んでひとつに連結します。

paste(person, sep = ",")
[1] "Noah"    "William" "Frida"   "Olivia" 

対応する順番のベクトルの要素とベクトルの要素を-を挟んで連結し、さらに、連結されたすべての要素を,を挟んでひとつに連結します。

paste(person, number, sep = "-", collapse = ",")
[1] "Noah-1,William-2,Frida-3,Olivia-4"

1.1 書式付き出力

C言語などでおなじみのsprintfで連結することもできます。

sprintf("%03d %s", number, person)
[1] "001 Noah"    "002 William" "003 Frida"   "004 Olivia" 

2 文字列と文字列の比較

==%in%を覚えておけば済みそうですが、色々とあります。

# ベクトル内の全てと比較
"Noah" == person
[1]  TRUE FALSE FALSE FALSE
# ベクトル内のどれかと完全一致
"Noah" %in% person
[1] TRUE
# 先頭からパターン全体が一致
startsWith(person, "Wi")
[1] FALSE  TRUE FALSE FALSE
# 末尾からパターン全体が一致
endsWith(person, "a")
[1] FALSE FALSE  TRUE  TRUE
# 第2引数のベクトル内のどれかと完全一致したときに、要素の位置を返す
match(person, c("Noah", "Olivia"))
[1]  1 NA NA  2
# マッチしないときにNAではなく0を戻す
match(person, c("Noah", "Olivia"), nomatch = 0)
[1] 1 0 0 2
# pmatch/charmatchは最大部分一致した要素の位置を返し、matchは完全一致した要素を返す
match(person, c("Noah Smith", "Olivia Rodrigo"))
[1] NA NA NA NA
pmatch(person, c("Noah Smith", "Olivia Rodrigo"))
[1]  1 NA NA  2

3 正規表現によるパターンマッチング

Rでも正規表現によるテキスト処理ができます。

正規表現は、^が行頭、$が行末、.が任意の1文字、[]は間で指定される文字のどれか1文字、*が直前の1文字かブロックの0回以上の繰り返し、+が直前の1文字かブロックの0回以上の繰り返し、()がブロックの終端、\\がこれら特殊記号をエスケープする文字です。[]の間は文字を並べますが、-で範囲指定もできます。Perl方言などまだまだ色々とありますが、だいたいこれで間に合うと思います。

txt <- c("This is a pen.", "This is an apple.")
# isが含まれる要素の位置
grep("[^a-z]is[^a-z]", txt) 
[1] 1 2
# appleが含まれる要素
grep("apple", txt, value = TRUE) 
[1] "This is an apple."
# appleが含まれない要素
grep("apple", txt, value = TRUE, invert = TRUE) 
[1] "This is a pen."
# isをwasに置換(1要素に複数あってもすべて置換)
gsub("([^a-z])(is)([^a-z])", "\\1was\\3", txt)
[1] "This was a pen."    "This was an apple."

置換時の括弧の中の文字列は\\1といったエスケープ文字と数字の組み合わせで表現されることに注意しましょう。 なお、括弧自体をマッチングしたい場合は、

gsub("\\(", "括弧始", "(...)")
[1] "括弧始...)"

と言うように括弧の前にエスケープ文字をつけます。

3.1 文字列内の文字列検索

正規表現で検索文字列を指定するregexprが使えます。C言語ではstrstrで文字列内の文字列を検索できますが、Rでは別の機能の関数になっており、該当する関数はありません。

(r_re <- regexpr("a$", person))
[1] -1 -1  5  6
attr(,"match.length")
[1] -1 -1  1  1
attr(,"index.type")
[1] "chars"
attr(,"useBytes")
[1] TRUE

attr(r_re, "match.length")で一致した長さを得ることができます。

書式の詳細を?sprintfで確認しながら使いましょう。%dで整数、%sで文字列、%.3fで小数点以下3桁まで、%%でパーセントを表示ぐらいが良く使うところだと思います。

3.2 文字列の分割

文字列を分解することもできます。

# リストで戻る
(lst <- strsplit(s, "-"))
[[1]]
[1] "Noah" "1"   

[[2]]
[1] "William" "2"      

[[3]]
[1] "Frida" "3"    

[[4]]
[1] "Olivia" "4"     
# 戻ったリストを分解
sapply(lst, function(x) x[1])
[1] "Noah"    "William" "Frida"   "Olivia" 
sapply(lst, function(x) x[2])
[1] "1" "2" "3" "4"

デリミタとして正規表現を使うことができます。

4 文字列の切り出し

# 6文字目から7文字目を切り出し
substr(txt, 6, 7)
[1] "is" "is"
# 6文字目から終端まで切り出し
substring(txt, 6)
[1] "is a pen."    "is an apple."
# 最初の要素は6文字目から7文字目の切り出し
# 2番目の要素は6文字目から8文字目の切り出し
substring(txt, 6, 7:8)
[1] "is"  "is "

5 文字数の取得

nchar(person)
[1] 4 7 5 6

6 文字列ではなく文字の置換

chartr("abc", "xyz", "abcaad")
[1] "xyzxxd"

6.1 アルファベットの大文字化と小文字化

toupper(txt)
[1] "THIS IS A PEN."    "THIS IS AN APPLE."
tolower(txt)
[1] "this is a pen."    "this is an apple."