文字の反復処理 (strsplit)
CoddyのRジャーニー「基礎」セクションの一部 — レッスン 65/78。
文字列内の各文字を個別に処理する必要がある場合はどうすればよいでしょうか?ベクトルとは異なり、Rでは文字列の文字を直接ループで処理することはできません。strsplit() 関数は、文字列を文字のベクトルに分割することで、この問題を解決します。
strsplit()関数は、分割する文字列と区切り文字の2つの引数を取ります。個々の文字に分割するには、空の文字列""を区切り文字として使用します:
word <- "hello"
chars <- strsplit(word, "")[[1]]
print(chars)出力:
[1] "h" "e" "l" "l" "o"末尾の [[1]] に注目してください。これは strsplit() がリストを返すためで、文字ベクトルを取得するには最初の要素を抽出する必要があるからです。文字をベクトルとして取得できれば、すでに学んだ手法を使ってそれらを反復処理できます:
word <- "R"
chars <- strsplit(word, "")[[1]]
for (char in chars) {
print(char)
}出力:
[1] "R"この手法は、特定の文字をカウントしたり、文字列を反転させたり、入力を1文字ずつ検証したりするようなタスクに不可欠です。
チャレンジ
簡単単語(例:programming)を含む1行の入力を受け取ります。
strsplit() を使用して文字列を個々の文字に分割します:
- 入力された単語を文字のベクトルに分割します
- ベクトルの各文字をループで処理します
- 文字
"a"が単語内に何回現れるかをカウントします(大文字と小文字を区別します) print()を使用して、各文字をそれぞれの行に出力します- ループの後に、
cat()を使用してCount of 'a': Xという形式(その後に改行)でカウントを出力します
例えば、入力が以下の場合:
banana出力は以下のようになります:
[1] "b"
[1] "a"
[1] "n"
[1] "a"
[1] "n"
[1] "a"
Count of 'a': 3説明:単語 "banana" は文字 c("b", "a", "n", "a", "n", "a") に分割されます。各文字が出力され、文字 "a" は3回現れます。
チートシート
文字列を個々の文字に分割するには、空の文字列 "" をセパレータとして strsplit() を使用します:
word <- "hello"
chars <- strsplit(word, "")[[1]]
print(chars)出力:
[1] "h" "e" "l" "l" "o"[[1]] は strsplit() によって返されたリストから最初の要素を抽出し、文字ベクトルを返します。
その後、文字をループで処理できます:
word <- "R"
chars <- strsplit(word, "")[[1]]
for (char in chars) {
print(char)
}自分で試してみよう
# 入力を読み込む
con <- file("stdin", "r")
word <- suppressWarnings(readLines(con, n = 1))
# 文字 'a' のカウンターを初期化
count_a <- 0
# TODO: 以下にコードを記述してください
# 1. strsplit() を使用して単語を個々の文字に分割する
# 2. 各文字をループで処理する
# 3. print() を使用して各文字を出力する
# 4. 'a' が出現する回数をカウントする
# 'a' のカウントを出力する
cat("Count of 'a': ", count_a, "\n", sep = "")このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。