« 2023年11月 | トップページ | 2024年1月 »

2023年12月31日 (日)

[R]tibbleの列名を変更する

rename関数かcolnames関数を使う。rename関数は任意の列名を変更することができる。また、渡されたtibbleの列名を変更するだけである。一方、colnames関数はすべてを一括で変更することしかできず、また、指定するtibbleの列名を強制的に変更する。

> library(tidyverse)
> tib <- tibble(
+ no = c(8, 30, 58),
+ name = c("ウオッカ", "ライスシャワー", "メイショウドトウ"),
+ seiyu = c("大橋彩香", "石見舞菜香", "和多田美咲")
+ )
> print(tib %>% as.data.frame())
no name seiyu
1 8 ウオッカ 大橋彩香
2 30 ライスシャワー 石見舞菜香
3 58 メイショウドトウ 和多田美咲
> tib2 <- tib %>% rename(id = no, voiceactress = seiyu)
> print(tib2 %>% as.data.frame())
id name voiceactress
1 8 ウオッカ 大橋彩香
2 30 ライスシャワー 石見舞菜香
3 58 メイショウドトウ 和多田美咲
> tib3 <- tib
> colnames(tib3) <- c("n", "horse", "cv")
> print(tib3 %>% as.data.frame())
n horse cv
1 8 ウオッカ 大橋彩香
2 30 ライスシャワー 石見舞菜香
3 58 メイショウドトウ 和多田美咲

2023年12月29日 (金)

[R]文字列型ベクトルの要素の文字列を連結する

文字列型ベクトル同士ではなく文字列型ベクトルの要素の文字列同士を連結するには、stringrパッケージのstr_c関数にcollapseオプションを付けて使う。str_c関数は引数に与えたベクトルをベクトルで処理しようとするため、デフォルトでは与えたベクトル同士を連結しようとするが、collapseオプションを使うと、与えた文字列型ベクトルの要素同士を連結する。文字列の間に何も挟みたくなければ""を指定する。

> library(stringr)
> s <- c("石見舞菜香", "優木かな", "和多田美咲")
> str_c(s)
[1] "石見舞菜香" "優木かな" "和多田美咲"
> str_c(s, collapse = "")
[1] "石見舞菜香優木かな和多田美咲"
> str_c(s, collapse = "_")
[1] "石見舞菜香_優木かな_和多田美咲"

2023年12月28日 (木)

[R]絶対パスを表す文字列からファイル名(ディレクトリ名)だけを取り出す

gsub関数を使う。以下はWindows環境下における絶対パス(区切り記号は「¥」)から、ファイル名とそれ以外のディレクトリ名をそれぞれ取り出した例。

> s <- c("C:\\マクロス\\Δ\\カナメ.バッカニア.txt")
> gsub("^.+\\\\", "", s)
[1] "カナメ.バッカニア.txt"
> gsub("\\\\[^\\]+$", "", s)
[1] "C:\\マクロス\\Δ"

2023年12月27日 (水)

[R]文字列型ベクトルの要素の文字列を連結する

文字列型ベクトル同士ではなく文字列型ベクトルの要素の文字列同士を連結するには、paste関数にcollapseオプションを付けて使う。paste関数は引数に与えたベクトルをベクトルで処理しようとするため、デフォルトでは与えたベクトル同士を連結しようとするが、collapseオプションを指定すると、与えた文字列型ベクトル内の文字列を連結する。文字列の間に何も挟みたくなければ""を指定する。

> s <- c("石見舞菜香", "優木かな", "和多田美咲")
> paste(s, sep = "")
[1] "石見舞菜香" "優木かな" "和多田美咲"
> paste(s, collapse = "")
[1] "石見舞菜香優木かな和多田美咲"
> paste(s, collapse = "_")
[1] "石見舞菜香_優木かな_和多田美咲"

2023年12月26日 (火)

[R]オブジェクトのクラスを調べる

Rでは、各オブジェクトのメモリへの格納方式をモードといい、これらにはさらにその格納された情報の型を持っており、その型をクラスという。通常コマンド操作をする際に意識することはないが、基礎知識として知っておくと有益。

> n <- 1:2
> s <- c("石見舞菜香", "ライスシャワー")
> b <- c(TRUE, FALSE)
> dt <- as.Date("2000-01-01")
> dtf <- data.frame(n, s)
> f <- function(x) {x ^ 2}
> class(n)
[1] "integer"
> class(s)
[1] "character"
> class(b)
[1] "logical"
> class(dt)
[1] "Date"
> class(dtf)
[1] "data.frame"
> class(f)
[1] "function"

2023年12月25日 (月)

[R]オブジェクトのモードを調べる

Rでは、各オブジェクトのメモリへの格納形式をモードという。通常コマンド操作をする際に意識することはないが、基礎知識として知っておくと有益。ベクトルのように各要素はすべて同じモードでなければならないものもあれば、リストのように異なるモードを持つものを格納できるオブジェクトもある。

> n <- 1:2
> s <- c("石見舞菜香", "ライスシャワー")
> b <- c(TRUE, FALSE)
> dt <- as.Date("2000-01-01")
> dtf <- data.frame(n, s)
> f <- function(x) {x ^ 2}
> mode(n)
[1] "numeric"
> mode(s)
[1] "character"
> mode(b)
[1] "logical"
> mode(dt)
[1] "numeric"
> mode(dtf)
[1] "list"
> mode(f)
[1] "function"

一部のモードは、typeof関数を使うともう少し詳しい情報を得ることができる。

> typeof(n)
[1] "integer"
> typeof(3.14)
[1] "double"
> typeof(dt)
[1] "double"

2023年12月24日 (日)

[R]郵便番号の一覧を得る

以下は2023年12月中旬に、日本郵便株式会社のウェブサイトから郵便番号の情報が納められたファイルをダウンロードして、郵便番号とそれに対応する町域等をデータフレームにした例。UTF-8形式のファイルをダウンロードしている。ダウンロードしたファイルはテンポラリファイルとして保存をして削除をしているが、そのファイルから展開したファイル(utf_ken_all.csv)はカレントディレクトリに保存をして、そのまま残していることに注意。

> url <- "https://www.post.japanpost.jp/zipcode/dl/utf/zip/utf_ken_all.zip"
> tfile <- tempfile()
> download.file(url, tfile)
URL 'https://www.post.japanpost.jp/zipcode/dl/utf/zip/utf_ken_all.zip' を試しています
Content type 'application/zip' length 2030910 bytes (1.9 MB)
downloaded 1.9 MB
> unzip(tfile)
> unlink(tfile)
> file.info(dir(pattern = "utf_ken_all\\.csv"))["size"]
size
utf_ken_all.csv 18333268
> zip <- read.table("utf_ken_all.csv", sep = ",", colClasses = "character")

町域で検索を試してみる。レゴランドジャパンが位置する住所(金城ふ頭)を検索してみると、一か所しか登録されていないことがわかる。ユニバーサル・スタジオ・ジャパンが位置する「桜島」も同様。「安野」が含まれる町域は複数あるが「希世乃」という町域は一か所も登録されていないことがわかる。

> subset(zip, grepl("^金城ふ頭$", V9), c(V3, V7, V8, V9))
V3 V7 V8 V9
67272 4550848 愛知県 名古屋市港区 金城ふ頭
> subset(zip, grepl("^桜島$", V9), c(V3, V7, V8, V9))
V3 V7 V8 V9
84513 5540031 大阪府 大阪市此花区 桜島
> subset(zip, grepl("安野", V9), c(V3, V7, V8, V9))
V3 V7 V8 V9
47777 9592003 新潟県 阿賀野市 安野町
47936 9592004 新潟県 阿賀野市 南安野町
49858 9300087 富山県 富山市 安野屋町
110837 7890253 高知県 長岡郡大豊町 安野々
114419 8380213 福岡県 朝倉郡筑前町 安野
> subset(zip, grepl("希世乃", V9), c(V3, V7, V8, V9))
[1] V3 V7 V8 V9
<0 行> (または長さ 0 の row.names)

2023年12月23日 (土)

[R]パッケージの関数を使う

「::」を使って、「(パッケージ)::(関数)」と表記することで使うことができる。以下は、MASSパッケージに含まれるムーア・ペンローズ一般逆行列を求めるginv関数を使用した例。MASSパッケージはRに標準で搭載されているが、起動時には自動で読み込まれないため、読み込まないと使うことはできない。

> mx <- matrix(1:4, 2, 2)
> ginv(mx)
ginv(mx) でエラー: 関数 "ginv" を見つけることができませんでした
> MASS::ginv(mx)
[,1] [,2]
[1,] -2 1.5
[2,] 1 -0.5

library関数を使ってパッケージをメモリに読み込むことで、パッケージ名を指定しなくても使うことができるようになる。読み込んだパッケージはdetach関数を使うことでメモリから解放することができる。detach関数でパッケージの指定をする際は「package:(パッケージ名)」とする。

> library(MASS)
> ginv(mx)
[,1] [,2]
[1,] -2 1.5
[2,] 1 -0.5
> head(survey, 3)
Sex Wr.Hnd NW.Hnd W.Hnd Fold Pulse Clap Exer Smoke Height M.I Age
1 Female 18.5 18.0 Right R on L 92 Left Some Never 173.0 Metric 18.250
2 Male 19.5 20.5 Left R on L 104 Left None Regul 177.8 Imperial 17.583
3 Male 18.0 13.3 Right L on R 87 Neither None Occas NA <NA> 16.917
> detach(package:MASS)
> ginv(mx)
ginv(mx) でエラー: 関数 "ginv" を見つけることができませんでした
> head(survey)
エラー: オブジェクト 'survey' がありません

library関数の代わりにrequire関数も使うことができる。library関数は読み込みに失敗するとエラーが発生するが、require関数は読み込みに成功するとTRUE、失敗するとFALSEと返して警告が発生する。quietlyオプションにTRUEを与えると、警告は発生しなくなる。

> require(MASS) == TRUE
[1] TRUE
> require(MASSS) == TRUE
要求されたパッケージ MASSS をロード中です
[1] FALSE
警告メッセージ:
library(package, lib.loc = lib.loc, character.only = TRUE, logical.return = TRUE, で:
‘MASSS’ という名前のパッケージはありません
> require(MASSS, quietly = TRUE) == TRUE
[1] FALSE

2023年12月22日 (金)

[R]全国の地方自治体のコード(全国地方公共団体コード)を一覧形式で得る

地方公共団体情報システム機構のウェブサイト(https://www.j-lis.go.jp/)では、地方自治体に割り当てた6桁の数字(全国地方公共団体コード)を公開している。全国の地方自治体を一つにまとめたファイルを以前はダウンロードすることができたが、現在は登録した団体しかそのサービスを利用することができない。

ウェブサイトでは県別に一覧表を掲載しているため、これをスクレイピングすることで、一括で得ることができる。以下、入手例。

> library(rvest)
> library(tidyverse)
> url <- "https://www.j-lis.go.jp/spd/code-address/jititai-code.html"
> html <- read_html(url)
> node <- html %>% html_nodes("a")
> idx <- grep("[都道府県]内[区市]", node)
> url9 <- node[idx] %>% html_attr("href")
> url <- paste0("https://www.j-lis.go.jp", url9)
> la0 <- as_tibble(NULL)
> for (i in seq(url)) {
+ lis <- read_html(url[i]) %>% html_table()
+ la0 <- rbind(la0, lis[[1]])
+ }
> la <- select(la0, 1:3) %>% rename(code = 1, name = 2, furigana = 3)
> la <- la %>% mutate(code = sprintf("%06d", code))

以下は、2023年12月中旬に行った結果。市は792、町は743、村は183あることがわかる(北方領土の6村は含まない)。

> head(la, 3) %>% as.data.frame()
code name furigana
1 011002 札幌市 さっぽろし
2 011011 札幌市中央区 さっぽろしちゅうおうく
3 011029 札幌市北区 さっぽろしきたく
> tail(la, 3) %>% as.data.frame()
code name furigana
1 473758 多良間村 たらまそん
2 473812 竹富町 たけとみちょう
3 473821 与那国町 よなぐにちょう
> la %>% filter(str_detect(name, "市$")) %>% nrow()
[1] 792
> length(grep("町$", la$name))
[1] 743
> length(grep("村$", la$name))
[1] 183

2023年12月21日 (木)

[R]オブジェクトを削除する

Rは代入したベクトルやリスト、定義した関数などは、明示的に削除しない限りそのままその環境に残る。再利用することができるし、逆に誤って使用してしまうこともある。その環境下に残されているオブジェクトを削除するには、rm関数を使う。

> ls()
character(0)
> n <- 1:3
> s <- c("ABC", "abc", "123")
> ls()
[1] "n" "s"
> print(s)
[1] "ABC" "abc" "123"
> rm(s)
> ls()
[1] "n"
> print(s)
エラー: オブジェクト 's' がありません

すべてのオブジェクトを削除したい倍は、listオプションにls関数の結果を与える。

> n <- 1:3
> s <- c("ABC", "abc", "123")
> ls()
[1] "n" "s"
> rm(list = ls())
> ls()
character(0)

ただし、これでは隠しオブジェクト(オブジェクト名が「.」から始まる)は削除されない。隠しオブジェクトも含めてすべて削除するには、ls関数のall.namesオプションにTRUEを与える。

> n <- 1:3
> s <- c("ABC", "abc", "123")
> d <- rnorm(4)
> ls()
[1] "d" "n" "s"
> ls(all.names = TRUE)
[1] ".Random.seed" "d" "n" "s"
> rm(list = ls())
> ls()
character(0)
> ls(all.names = TRUE)
[1] ".Random.seed"

やり直す。

> n <- 1:3
> d <- rnorm(4)
> ls(all.names = TRUE)
[1] ".Random.seed" "d" "n"
> rm(list = ls(all.names = TRUE))
> ls(all.names = TRUE)
character(0)

2023年12月17日 (日)

[R]保存されているオブジェクトを確認する

Rはオブジェクト(値を代入したベクトルやリスト、定義した関数など)は、明示的に削除しない限りそのままその環境に残る。再利用することができるし、逆に誤って使用してしまうこともある。その環境下に残されているオブジェクトを確認するには、objects関数かls関数を使う。

Rを起動した直後に実行すると、以下のようになるはず。

> objects()
character(0)

objects関数(ls関数も同様、以下同じ)は環境下に残されているオブジェクトのオブジェクト名を文字列型ベクトルで返す。起動直後は何もオブジェクトが無い(実はあるがそれは後述)ため、長さが0の文字列型ベクトルが返される。

> n <- 1:3
> s <- c("ABC", "abc", "123")
> objects()
[1] "n" "s"
> ls()
[1] "n" "s"

all.namesオプションにTRUEを与えると、隠しオブジェクト(オブジェクト名が「.」から始まる)も含めてすべて表示する。

> d <- rnorm(4)
> ls()
[1] "d" "n" "s"
> ls(all.names = TRUE)
[1] ".Random.seed" "d" "n" "s"

2023年12月16日 (土)

[R]動作環境の設定を確認する

options関数を使う。戻り値はリストのため、個々の値を直接確認するには、名前を指定する。

> options()
$add.smooth
[1] TRUE
$askYesNo
function (msg, ...)
{
(以下、表示省略)
> str(options())
List of 69
$ add.smooth : logi TRUE
$ askYesNo :function (msg, ...)
(以下、表示省略)
> class(options())
[1] "list"
> options()$digits
[1] 7

2023年12月15日 (金)

[R]行列に列を追加する

cbind関数を使う。最後の例のとおり、行数が異なる場合はエラーが発生する。

> mx1 <- matrix(1:9, nrow = 3)
> mx2 <- matrix(10:15, nrow = 3)
> print(mx1)
[,1] [,2] [,3]
[1,] 1 4 7
[2,] 2 5 8
[3,] 3 6 9
> print(mx2)
[,1] [,2]
[1,] 10 13
[2,] 11 14
[3,] 12 15
> mx3 <- cbind(mx1, mx2)
> print(mx3)
[,1] [,2] [,3] [,4] [,5]
[1,] 1 4 7 10 13
[2,] 2 5 8 11 14
[3,] 3 6 9 12 15
> mx4 <- matrix(16:19, nrow = 4)
> print(mx4)
[,1]
[1,] 16
[2,] 17
[3,] 18
[4,] 19
> cbind(mx1, mx4)
cbind(mx1, mx4) でエラー:
行列の行数は一致していなければなりません (2 番目の引数を参照)

2023年12月13日 (水)

[R]行列に行を追加する

rbind関数を使う。最後の例のとおり、列数が異なる場合はエラーが発生する。

> mx1 <- matrix(1:9, ncol = 3)
> mx2 <- matrix(10:15, ncol = 3)
> print(mx1)
[,1] [,2] [,3]
[1,] 1 4 7
[2,] 2 5 8
[3,] 3 6 9
> print(mx2)
[,1] [,2] [,3]
[1,] 10 12 14
[2,] 11 13 15
> mx3 <- rbind(mx1, mx2)
> print(mx3)
[,1] [,2] [,3]
[1,] 1 4 7
[2,] 2 5 8
[3,] 3 6 9
[4,] 10 12 14
[5,] 11 13 15
> mx4 <- matrix(16:19, ncol = 4)
> print(mx4)
[,1] [,2] [,3] [,4]
[1,] 16 17 18 19
> rbind(mx1, mx4)
rbind(mx1, mx4) でエラー:
行列の列数は一致していなければなりません (2 番目の引数を参照)

2023年12月12日 (火)

[R]文字列から数値を作成する

as.numeric関数を使う。Rでは数値の扱いはデフォルトでは浮動小数点数(実数)のため、特に指定しない限り整数を表す文字列は浮動小数点数として扱われる。これを整数として扱うにはas.integer関数を使う。as.double関数はas.numeric関数と同じである。

> s <- c("0", "1", "-2", "3.14")
> print(s)
[1] "0" "1" "-2" "3.14"
> as.numeric(s)
[1] 0.00 1.00 -2.00 3.14
> as.integer(s)
[1] 0 1 -2 3
> as.double(s)
[1] 0.00 1.00 -2.00 3.14
> as.numeric(c("0", "1", "-2", "3.14", "abc"))
[1] 0.00 1.00 -2.00 3.14 NA
警告メッセージ:
強制変換により NA が生成されました

最後の例のとおり、数値を表さない文字列の場合は警告が発生し、数値ではなく強制的にNAに変換される。

2023年12月11日 (月)

[R]ロウ型ベクトルの値を置換する

[ ]演算子を利用する。以下は、ヌル(0x00)を空白(0x20)に置換する例。

> ch <- c(0x41:0x43, 0x00, 0x61:0x63, 0x00, 0x31:0x33)
> ra <- as.raw(ch)
> rawToChar(ra)
rawToChar(ra) でエラー:
文字列の中に nul が埋め込まれています: 'ABC\0abc\0123'
> ra[ra == as.raw(0x0)] <- as.raw(0x20)
> rawToChar(ra)
[1] "ABC abc 123"

2023年12月 7日 (木)

[R]ベクトルに要素を追加する

c関数を使う。Rにおける値の処理は基本的にベクトル単位のため、ベクトルを作成するc関数にベクトルを与えれば、複数のベクトルから1つのベクトルを作ることができる。

> s1 <- c("カナメ", "フレイア")
> s2 <- c("マキナ", "レイナ")
> s <- c(s1, "美雲", s2)
> print(s)
[1] "カナメ" "フレイア" "美雲" "マキナ" "レイナ"

2023年12月 4日 (月)

[R]ベクトルとは

Rでは数値や文字などの値を扱う際、同じ種類の値はひとまとめにして扱う。このひとまとめにした値の入れ物をベクトルという。ベクトルに含める値は1個もあれば複数個もあり、0個の場合もある。ベクトルを作る方法はいろいろあるが、c関数を使うと簡単に作成することができる。

> n <- c(1, 2, 3, 5)
> print(n)
[1] 1 2 3 5
> s <- c("カナメ", "フレイア", "美雲", "マキナ", "レイナ")
> print(s)
[1] "カナメ" "フレイア" "美雲" "マキナ" "レイナ"
> s <- "ワルキューレ"
> print(s)
[1] "ワルキューレ"
> d <- double(0)
> print(d)
numeric(0)

1つ目の例は、4つの数値をひとまとめにしたベクトルを作成している。2つ目の例は、5つの文字列をひとまとめにしたベクトルを作成している。3つ目の例のとおり、値を1つしか持たないベクトルも作成することができる。最後の例では、値を1つも持たないベクトルを作成している。

2023年12月 3日 (日)

[R]正規表現を使用して任意の長さの文字列を検索する

「.」と「{n}」を使う。パターンでは「.」は\n以外の任意の一文字を示す。「{n}」は直前の文字をn回繰り返す意味になる。なお、「{n,}」とするとn回以上という意味になる。

> s <- c("a", "ab", "abc", "abcd")
> grep("^.$", s)
[1] 1
> grep("^.$", s, value = TRUE)
[1] "a"
> grep("^..$", s, value = TRUE)
[1] "ab"
> grep("^.{2}$", s, value = TRUE)
[1] "ab"
> grep("^.{2,}$", s, value = TRUE)
[1] "ab" "abc" "abcd"
> s <- c("この葉", "木の葉", "樹木の葉")
> grep("の", s, value = TRUE)
[1] "この葉" "木の葉" "樹木の葉"
> grep("^.の", s, value = TRUE)
[1] "この葉" "木の葉"

2023年12月 2日 (土)

[R]日付時刻型ベクトルを作成する

readrパッケージのparse_datetime関数を使うと、文字列から簡単に日付時刻型ベクトルを作ることができる。ただし、その際はタイムゾーンを指定する必要がある。。format関数を使うと、第1引数に与えた日付時刻型ベクトルから文字列型ベクトルを作ることができる。その際の出力は、加工することができる。

> library(readr)
> parse_datetime("2001-12-23 12:34:56")
[1] "2001-12-23 12:34:56 UTC"
> Sys.timezone()
[1] "Asia/Tokyo"
> parse_datetime("2001-12-23 12:34:56", locale = locale(tz = "Asia/Tokyo"))
[1] "2001-12-23 12:34:56 JST"
> dtm <- parse_datetime("2001-12-23 12:34:56", locale = locale(tz = "Asia/Tokyo"))
> mode(dtm)
[1] "numeric"
> class(dtm)
[1] "POSIXct" "POSIXt"
> format(dtm, "%Y/%m/%d %H時%M分%S秒 %Z")
[1] "2001/12/23 12時34分56秒 JST"
> dtm <- parse_datetime(c("2001-12-23 12:34:56", "2002-02-23 23:45:12"), locale = locale(tz = "Asia/Tokyo"))
> dtm
[1] "2001-12-23 12:34:56 JST" "2002-02-23 23:45:12 JST"
> format(dtm, "%Y/%m/%d %H時%M分%S秒 %Z")
[1] "2001/12/23 12時34分56秒 JST" "2002/02/23 23時45分12秒 JST"

2023年12月 1日 (金)

[R]日付時刻型ベクトルを作成する

as.POSIXct関数を使うと、文字列から簡単に日付時刻型ベクトルを作ることができる。format関数を使うと、第1引数に与えた日付時刻型ベクトルから文字列型ベクトルを作ることができる。その際の出力は、加工することができる。

> as.POSIXct("2001-12-23 12:34:56")
[1] "2001-12-23 12:34:56 JST"
> dtm <- as.POSIXct("2001-12-23 12:34:56")
> mode(dtm)
[1] "numeric"
> class(dtm)
[1] "POSIXct" "POSIXt"
> format(dtm, "%Y/%m/%d %H時%M分%S秒 %Z")
[1] "2001/12/23 12時34分56秒 JST"
> dtm <- as.POSIXct(c("2001-12-23 12:34:56", "2002-02-23 23:45:12"))
> dtm
[1] "2001-12-23 12:34:56 JST" "2002-02-23 23:45:12 JST"
> format(dtm, "%Y/%m/%d %H時%M分%S秒")
[1] "2001/12/23 12時34分56秒" "2002/02/23 23時45分12秒"

« 2023年11月 | トップページ | 2024年1月 »

無料ブログはココログ

■■

■■■