R言語でデータフレームの全角半角変換、記号削除、大文字小文字変換など ※「chartr」追加

# 全角→半角変換(準備)

サンプルとして文字やアルファベット、記号を含むデータフレームを用意しました。

~~~R
library(tidyverse)
setwd("/Users/name/DATAS/")
data_01 <- read.csv("test_200208.csv", header = T)  
data_01
  id           text01       text02
1  1        あいうえお   かきくけこ
2  2       アイウエオ   カキクケコ
3  3       ＡＢＣＤＥ   ＦＧＨＩＪ
4  4       ａｂｃｄｅ   ｆｇｈｉｊ
5  5  記号! " # $記号 記 , - . /号
~~~

わかりにくいかもしれませんが、アルファベットは全角です
データの型を確認します。

~~~R
class(data_01)
[1] "data.frame"
str(data_01)
'data.frame':	5 obs. of  3 variables:
 $ id    : int  1 2 3 4 5
 $ text01: chr  "あいうえお" "アイウエオ" "ＡＢＣＤＥ" "ａｂｃｄｅ" ...
 $ text02: chr  "かきくけこ" "カキクケコ" "ＦＧＨＩＪ" "ｆｇｈｉｊ" ...
~~~

# 全角→半角変換(stri_trans_general：実行)

「stringi」パッケージの「stri_trans_general」関数を使ってみます。

~~~R
library(stringi)
data_02 <- data_01 %>%
 mutate(
    text01_b = stri_trans_general(text01 , "Fullwidth-Halfwidth"),
    text02_b = stri_trans_general(text02 , "Fullwidth-Halfwidth")
  )

data_02
  id           text01       text02         text01_b     text02_b
1  1       あいうえお   かきくけこ       あいうえお   かきくけこ
2  2       アイウエオ   カキクケコ            ｱｲｳｴｵ        ｶｷｸｹｺ
3  3       ＡＢＣＤＥ   ＦＧＨＩＪ            ABCDE        FGHIJ
4  4       ａｂｃｄｅ   ｆｇｈｉｊ            abcde        fghij
5  5  記号! " # $記号 記 , - . /号  記号! " # $記号 記 , - . /号
~~~

アルファベットとカタカナが半角になります。

（参考）

https://qiita.com/swathci/items/1ca9177e0c24c8dc1355


# 全角→半角変換(halfwidthr：準備)

「halfwidthr」というパッケージも試してみました。
インストールするためには、「devtools」パッケージが必要です。

~~~R
install.packages("devtools")
trying URL 'https://mirror.las.iastate.edu/CRAN/bin/macosx/big-sur-arm64/contrib/4.1/devtools_2.4.4.tgz'
Content type 'application/x-gzip' length 422640 bytes (412 KB)
==================================================
downloaded 412 KB
~~~

うまくインストールできていないので、上記メッセージの「trying URL」でtgzファイルをダンロードし、tgzを直接指定してインストールします。

~~~R
download.file(
  "https://mirror.las.iastate.edu/CRAN/bin/macosx/big-sur-arm64/contrib/4.1/devtools_2.4.4.tgz", 
  "devtools"
)
install.packages("devtools", repos = NULL, type = "source")
library(devtools)
~~~

「halfwidthr」をインストールします。

~~~R
install_github("yutannihilation/halfwidthr")
library(halfwidthr)
~~~

（参考）

https://heavywatal.github.io/rstats/devtools.html

https://notchained.hatenablog.com/entry/2014/12/01/003008

# 全角→半角変換(halfwidthr：実行)

「halfwidthr」では、カタカナは全角のままです。

~~~R
data_02_2 <- data_01 %>%
    mutate(
        text01_c = halfwidthen(text01),
        text02_c = halfwidthen(text02)
    )

data_02_2
  id           text01       text02         text01_c     text02_c
1  1       あいうえお   かきくけこ       あいうえお   かきくけこ
2  2       アイウエオ   カキクケコ       アイウエオ   カキクケコ
3  3       ＡＢＣＤＥ   ＦＧＨＩＪ            ABCDE        FGHIJ
4  4       ａｂｃｄｅ   ｆｇｈｉｊ            abcde        fghij
5  5  記号! " # $記号 記 , - . /号  記号! " # $記号 記 , - . /号
~~~

# 記号削除・置換(gsub)

形態素解析をかける場合は、記号置換は削除しています。
R標準の「gsub」を「lapply」を使ってデータフレームに適用することで削除します。
lapply」は第1引数にデータ（オブジェクト）、第2引数に関数を指定でき、返り値はリストです。

~~~R
data_03 <- data_02_2
data_03[,4:5] <- 
    lapply(data_03[,3:4] , gsub,, pattern="\\W", replacement = "")

data_03
  id           text01       text02   text01_c   text02_c
1  1       あいうえお   かきくけこ かきくけこ あいうえお
2  2       アイウエオ   カキクケコ カキクケコ アイウエオ
3  3       ＡＢＣＤＥ   ＦＧＨＩＪ ＦＧＨＩＪ      ABCDE
4  4       ａｂｃｄｅ   ｆｇｈｉｊ ｆｇｈｉｊ      abcde
5  5  記号! " # $記号 記 , - . /号       記号   記号記号

data_03[5,4:5]
  text01_c text02_c
5     記号 記号記号
~~~

記号が削除され、 「mutate」で作成した「text01_c」 「text02_c」列にそれぞれ「記号」「記号記号」が入っています。

（参考）

https://qiita.com/YM_DSKR/items/017a5dddeb56fcdf1054

# 記号削除・置換(str_replace_all)

「stringr」パッケージの「str_replace_all」関数を使ってみます。

~~~R
data_03_b <- data_02_2
data_03_c <- 
    data_03_b %>% 
    mutate(text01_c = (str_replace_all(text01_c, pattern="\\W", replacement="")),
           text02_c = (str_replace_all(text02_c, pattern="\\W", replacement=""))
)

data_03_c
  id           text01       text02   text01_c   text02_c
1  1       あいうえお   かきくけこ あいうえお かきくけこ
2  2       アイウエオ   カキクケコ アイウエオ カキクケコ
3  3       ＡＢＣＤＥ   ＦＧＨＩＪ      ABCDE      FGHIJ
4  4       ａｂｃｄｅ   ｆｇｈｉｊ      abcde      fghij
5  5  記号! " # $記号 記 , - . /号   記号記号       記号

data_03_c[5,4:5]
  text01_c text02_c
5 記号記号     記号
~~~

（参考）

https://heavywatal.github.io/rstats/stringr.html

# 大文字小文字変換(str_to_lower)

アルファベットを大文字、小文字に返還する場合は、「stringr」パッケージの「str_to_lower」関数を使います。
大文字にする場合は「str_to_upper]を使用します。

~~~R
data_04 <- data_02_2
data_04_b <- 
    data_04 %>% 
    mutate(text01_c = str_to_lower(text01_c),
           text02_c = str_to_lower(text02_c)
)
~~~

（参考）

https://www.medi-08-data-06.work/entry/how_to_use_stringr0220

# 複数ファイル読み込み（list.files）

上記などの処理をする前に、データが複数ファイルに分かれている場合、まとめてインポートすることがあります。
データは同じフォーマット（列数と名称が一致）にし、同じディレクトリに集めます。
パスを読み込み、そのパスを「read_csv」に適用しています。

~~~R
library(readr)
texts_path <- list.files(path = "/Users/user/ファイルが入っているディレクトリ/", pattern = "*.csv", full.names = T)

head(texts_path)
[1] "/Users/user/ファイルが入っているディレクトリ//aaa.csv"                   
[2] "/Users/user/ファイルが入っているディレクトリ//bbb.csv"             
[3] "/Users/user/ファイルが入っているディレクトリ//ccc.csv"    
#（略） 

# 「sapply」：引き数でデータ（オブジェクト）と関数を渡すと、データの各要素ごとに関数を適用
# col_types = cols(.default = "c") ですべての列を文字列型に
texts <- sapply(texts_path, read_csv, simplify=FALSE,  col_types = cols(.default = "c")) 
~~~

# 「chartr」で全角半角変換

コメントで教えてもらった「chartr」を使用したので追記します。

~~~R
chartr(z, y, x)
文字列「x」を対象に、「z」を「y」に置換

chartr("Ａ", "a", "ＡＢＣ")
[1] "aＢＣ"
~~~

関数を設定し、「sapply」で変換を実行します。

~~~R
data_01
  id           text01       text02
1  1       あいうえお   かきくけこ
2  2       アイウエオ   カキクケコ
3  3       ＡＢＣＤＥ   ＦＧＨＩＪ
4  4       ａｂｃｄｅ   ｆｇｈｉｊ
5  5  記号! " # $記号 記 , - . /号

#関数
data_chartr <- function(x) {
  y <- chartr("[Ａ-Ｚａ-ｚ０-９]",  "[A-Za-z0-9]", x)
  return(y) 
}

#sapplyでデータフレームに適用
data_ch1 <- sapply(data_01, data_chartr) %>% as.data.frame()

data_ch1
  id           text01       text02
1  1       あいうえお   かきくけこ
2  2       アイウエオ   カキクケコ
3  3            ABCDE        FGHIJ
4  4            abcde        fghij
5  5  記号! " # $記号 記 , - . /号

#sapplyと合わせて関数を設定する方法
data_chtr_1 <- sapply(data_01, function(x) {chartr("[Ａ-Ｚａ-ｚ０-９]",  "[A-Za-z0-9]", x)})　%>% as.data.frame()

data_chtr_1 
  id           text01       text02
1  1       あいうえお   かきくけこ
2  2       アイウエオ   カキクケコ
3  3            ABCDE        FGHIJ
4  4            abcde        fghij
5  5  記号! " # $記号 記 , - . /号
~~~

**了**