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

2024年12月28日 (土)

[R]正規分布する乱数を得る

rnorm関数を使う。rnorm関数は正規分布に基づく乱数を返す。第一引数に指定した個数の実数を返す。デフォルトでは平均0、標準偏差1の正規分布の基づく乱数を返すが、meanオプションとsdオプションに正規分布の平均と標準偏差の値をそれぞれ指定することができる。

> rnorm(6)
[1] 0.8549655 1.6048736 -0.7680202 -0.6509009 0.3799471 1.4280449
> rnorm(6, mean = 10)
[1] 8.030706 9.324379 9.554407 9.463829 11.769583 8.810051
> rnorm(6, mean = 20, sd = 2)
[1] 19.10057 21.46614 20.83233 23.92880 22.03404 16.10972
> hist(rnorm(10 ^ 7, mean = 50, sd = 5), breaks = 40)

2024年12月27日 (金)

[R]一様分布する乱数を得る

runif関数を使う。runif関数は一様分布(指定の範囲内で各値が一様の確率で現れる分布)に基づく乱数を返す。第一引数に指定した個数の実数を返す。デフォルトでは0<x<1の範囲内の値を返すが、minオプションとmaxオプションに一様分布の範囲の両端の値をそれぞれ指定することができる。

マニュアルには「runif will not generate either of the extreme values unless max = min or max-min is small compared to min, and in particular not for the default arguments. 」とあり、原則両端の値は含まない乱数が返されることに注意。

> runif(6)
[1] 0.73539532 0.02306577 0.92723891 0.09129656 0.27582346 0.32496829
> runif(5, min = 0.5)
[1] 0.9989089 0.7668412 0.7744202 0.5232379 0.5672689
> runif(4, min = 0, max = 100)
[1] 78.59427 53.52239 65.26063 29.73860
> hist(runif(10 ^ 7), breaks = 100)

2024年12月26日 (木)

[R]ファイルの大きさ(ファイルサイズ)を得る

list.files関数で調べたいファイル名を取得し、file.info関数を使ってファイルの情報を得ればよい。file.info関数の戻り値はリストで、要素sizeにファイルの大きさがバイト単位で格納されている。以下の例のとおり、list.files関数にfull.namesオプションにTRUEを指定しないと、戻り値の各要素がNAで返されてしまうので注意。

以下は、ある環境下のC:\Windowsに置かれたファイル名が「w」で始まる拡張子がiniかexeのファイルの大きさを調べた例。

> fl <- list.files("C:\\Windows", "^w.+\\.(ini|exe)")
> file.info(fl)
size isdir mode mtime ctime atime exe
win.ini NA NA winhlp32.exe NA NA > file.info(fl)[1]
size
win.ini NA
winhlp32.exe NA
> fl <- list.files("C:\\Windows", "^w.+\\.(ini|exe)", full.names = TRUE)
> file.info(fl)[1]
size
C:\\Windows/win.ini 92
C:\\Windows/winhlp32.exe 12288

2024年12月25日 (水)

[R]パターンにマッチするか否かを論理値で返す

stringrパッケージのstr_detect関数を使う。同じstringrパッケージのstr_which関数はパターンにマッチする要素のインデックスを返すが、str_detect関数はマッチする要素は真(TRUE)、マッチしない要素は偽(FALSE)を返す。機能としてはbaseパッケージのgrepl関数と同等。

> s <- c("石見舞菜香", "鈴木みのり", "瀬戸麻沙美", "和多田美咲")
> stringr::str_which(s, "美")
[1] 3 4
> stringr::str_which(s, "美$")
[1] 3
> stringr::str_detect(s, "美")
[1] FALSE FALSE TRUE TRUE
> stringr::str_detect(s, "美$")
[1] FALSE FALSE TRUE FALSE
> grepl("美$", s)
[1] FALSE FALSE TRUE FALSE

2024年12月24日 (火)

[R]パターンにマッチするか否かを論理値で返す

grepl関数を使う。grep関数はパターンにマッチする要素のインデックスを返すが、grepl関数はマッチする要素は真(TRUE)、マッチしない要素は偽(FALSE)を返す。

> s <- c("石見舞菜香", "鈴木みのり", "瀬戸麻沙美", "和多田美咲")
> grep("美", s)
[1] 3 4
> grep("美$", s)
[1] 3
> grepl("美", s)
[1] FALSE FALSE TRUE TRUE
> grepl("美$", s)
[1] FALSE FALSE TRUE FALSE

2024年12月23日 (月)

[R]日付時刻型ベクトルのタイムゾーンを変更する

force_tz関数を使う。指定のタイムゾーンに応じて時刻を変換するのではなく、ベクトルに保存されているタイムゾーンの情報だけを強制的に書き換えることに注意。

例えば、読み込むときに日付はそのままに誤ってUTCとして読み込んでしまった場合などにJSTであると強制的に書き換える場合などに使える。

> library(lubridate)
> Sys.timezone()
[1] "Asia/Tokyo"
> dttm <- ymd_hms("2001-02-03 04:05:06")
> print(dttm)
[1] "2001-02-03 04:05:06 UTC"
> dttm <- force_tz(dttm, tzone = Sys.timezone())
> print(dttm)
[1] "2001-02-03 04:05:06 JST"

タイムゾーンの情報を変えるのではなく日付時刻を指定のタイムゾーンに変換する場合は、with_tz関数を使う。

2024年12月21日 (土)

[R]日付時刻型ベクトルの日付時刻を指定のタイムゾーンの日付時刻に変更する

with_tz関数を使う。指定の日付時刻を指定のタイムゾーンに応じて時刻を変換する。

以下の例では、タイムゾーンが日本標準時(JST)の日付時刻を太平洋標準時(PST)に変換した例。JSTとPSTの時差は17時間(PST+17=JST)のため、PSTに変換した日付時刻が17時間戻っていることが分かる。

例えば、読み込むときに日付はそのままに誤ってUTCとして読み込んでしまった場合などにJSTであると強制的に書き換える場合などに使える。

> library(lubridate)
> dttm1 <- ymd_hms("2001-02-03 04:05:06", tz = "Asia/Tokyo")
> print(dttm1)
[1] "2001-02-03 04:05:06 JST"
> dttm2 <- with_tz(dttm1, tz = "America/Los_Angeles")
> print(dttm2)
[1] "2001-02-02 11:05:06 PST"

日付時刻を変換するのではなくタイムゾーンの情報を変更する場合は、force_tz関数を使う。

2024年12月20日 (金)

[R]read_csv関数で読み込まれる日付時刻型ベクトルについて

CSVファイルにタイムゾーンも明記されている場合は、そのタイムゾーンの日付時刻として読み取るが、ベクトルにはUTCに変換して保存される。

タイムゾーンが明記されていない日付時刻は強制的にUTCであるとして読み込み、保存されてしまう。読み込み後にJSTにする場合は、force_tz関数でタイムゾーンだけをJSTに変える必要がある。

> library(tidyverse)
> options(readr.show_progress = FALSE, readr.show_col_types = FALSE)
> Sys.timezone()
[1] "Asia/Tokyo"
> s <- "2001-02-03T04:05:06+09:00"
> dtf <- data.frame(dttm = s)
> write_csv(dtf, file = "temp.csv")
> cat(read_file("temp.csv"))
dttm
2001-02-03T04:05:06+09:00
> tib <- read_csv("temp.csv")
> print(tib$dttm)
[1] "2001-02-02 19:05:06 UTC"
> s <- "2001-02-03T04:05:06"
> dtf <- data.frame(dttm = s)
> write_csv(dtf, file = "temp.csv")
> cat(read_file("temp.csv"))
dttm
2001-02-03T04:05:06
> tib <- read_csv("temp.csv")
> print(tib$dttm)
[1] "2001-02-03 04:05:06 UTC"
> tib <- tib |> mutate(dttm = force_tz(dttm, tzone = Sys.timezone()))
> print(tib$dttm)
[1] "2001-02-03 04:05:06 JST"

2024年12月19日 (木)

[R]write_csv関数で出力される日付時刻型ベクトルについて

日付時刻型ベクトルを出力すると、UTCに変換されて出力されることに注意。なお、日付型ベクトルは当然この影響を受けない。

現在の環境の日時を表す文字列で出力したければ、文字列に変換する必要がある。

> library(tidyverse)
> options(readr.show_progress = FALSE, readr.show_col_types = FALSE)
> print(Sys.timezone())
[1] "Asia/Tokyo"
> dttm <- ymd_hms("2001-02-03 04:05:06")
> dat <- ymd("2010-11-12")
> print(dttm)
[1] "2001-02-03 04:05:06 UTC"
> print(dat)
[1] "2010-11-12"
> dtf <- data.frame(dttm, dat)
> write_csv(dtf, file = "temp.csv")
> cat(read_file("temp.csv"))
dttm,dat
2001-02-03T04:05:06Z,2010-11-12
> dttm <- ymd_hms("2001-02-03 04:05:06", tz = Sys.timezone())
> print(dttm)
[1] "2001-02-03 04:05:06 JST"
> dtf <- data.frame(dttm)
> write_csv(dtf, file = "temp.csv")
> cat(read_file("temp.csv"))
dttm
2001-02-02T19:05:06Z
> s <- format(dttm, "%Y-%m-%dT%H:%M:%S")
> print(s)
[1] "2001-02-03T04:05:06"
> dtf <- data.frame(dttm = s)
> write_csv(dtf, file = "temp.csv")
> cat(read_file("temp.csv"))
dttm
2001-02-03T04:05:06
> s = format(dttm, "%Y-%m-%dT%H:%M:%S%z")
> print(s)
[1] "2001-02-03T04:05:06+0900"
> dtf <- data.frame(dttm = s)
> write_csv(dtf, file = "temp.csv")
> cat(read_file("temp.csv"))
dttm
2001-02-03T04:05:06+0900

2024年12月18日 (水)

[R]ymd_hms関数で作成される日付時刻型ベクトルのタイムゾーンについて

実行環境如何に関わらず作成時にタイムゾーン(等時帯)を明示的に指定をしなければ、UTC(協定世界時)の日付時刻が作成されるので注意。この場合、文字列で指定した時刻がUTCに変換されるわけではなく、指定した文字列のUTCが作成されてしまう。JST(日本標準時)で作成したければ、タイムゾーンを適切に指定すること。

> Sys.timezone()
[1] "Asia/Tokyo"
> dttm <- ymd_hms(c("2001-02-03T04:05:06", "2010-11-12T13:14:15"))
> print(dttm)
[1] "2001-02-03 04:05:06 UTC" "2010-11-12 13:14:15 UTC"
> dttm <- ymd_hms("2001-02-03T04:05:06", tz = Sys.timezone())
> print(dttm)
[1] "2001-02-03 04:05:06 JST"

2024年12月17日 (火)

[R]ベクトルから指定の条件に一致する要素を抜き出す

which関数を使う。戻り値はインデックスであることに注意。指定の条件に一致する要素がない場合は、長さが0のベクトルが返される。最後の例のとおり、|記号(||記号ではない!)を使うと複数の条件を指定することもできる。

> n <- 2 ^ (0:8)
> print(n)
[1] 1 2 4 8 16 32 64 128 256
> which(n > 100)
[1] 8 9
> which(n > 1000)
integer(0)
> length(which(n > 100))
[1] 2
> length(which(n > 1000))
[1] 0
> seiyu <- c("安野希世乃", "鈴木みのり", "本渡楓")
> which(seiyu == "鈴木みのり")
[1] 2
> which(seiyu == "鈴木みのり" | seiyu == "本渡楓")
[1] 2 3

2024年12月14日 (土)

[R]正規表現を使用していずれかの文字列にマッチする文字列を抜き出す

|記号を使う。それぞれの文字列は( )(括弧)で囲む。

> name <- c("カナメ", "セナディア", "イレイナ")
> seiyu <- c("安野希世乃", "鈴木みのり", "本渡楓")
> grep("イ", name, value = TRUE)
[1] "イレイナ"
> grep("カ", name, value = TRUE)
[1] "カナメ"
> grep("(イ|カ)", name, value = TRUE)
[1] "カナメ" "イレイナ"
> grep("(カ|ナ)", name, value = TRUE)
[1] "カナメ" "セナディア" "イレイナ"
> grep("(カ|ナ$)", name, value = TRUE)
[1] "カナメ" "イレイナ"

2024年12月13日 (金)

[R]tibbleに新しい列を追加する

add_column関数を使う。.afterオプション(.beforeオプションもある)を使うと任意の位置に追加することができる。

> library(tibble)
> no <- 1:2
> name <- c("セナディア", "イレイナ")
> tib <- tibble(no, name)
> tib |> as.data.frame()
no name
1 1 セナディア
2 2 イレイナ
> seiyu <- c("鈴木みのり", "本渡楓")
> tib <- tib |> add_column(seiyu = seiyu)
> tib |> as.data.frame()
no name seiyu
1 1 セナディア 鈴木みのり
2 2 イレイナ 本渡楓
> tib <- tib |> add_column(seiyu2 = seiyu, .after = no)
> tib |> as.data.frame()
no seiyu2 name seiyu
1 1 鈴木みのり セナディア 鈴木みのり
2 2 本渡楓 イレイナ 本渡楓

2024年12月12日 (木)

[R]特殊な文字が含まれる名前を付けた要素からなるリストを作成する

要素名を指定する際、通常の単語はそのまま指定すればよいが、例えば空白を含むような特殊な文字を含む場合は、指定する要素名を「‘」(バックティック)で囲む必要があるので注意。

> name <- c("リフ", "セナディア")
> seiyu <- c("瀬戸麻沙美", "鈴木みのり")
> lis <- list(name = name, @seiyu = seiyu)
エラー: 予想外の '@' です ( "lis <- list(name = name, @" の)
> lis <- list(name = name, 声 優 = seiyu)
エラー: 想定外のシンボルです ( "lis <- list(name = name, 声 優" の)
> lis <- list(name = name, `@seiyu` = seiyu, `声 優` = seiyu)
> print(lis)
$name
[1] "リフ" "セナディア"
$`@seiyu`
[1] "瀬戸麻沙美" "鈴木みのり"
$`声 優`
[1] "瀬戸麻沙美" "鈴木みのり"

2024年12月11日 (水)

[R]リストに名前を付けた要素を追加する

list関数とc関数を組み合わせて使う。

> no <- 1:2
> name <- c("リフ", "セナディア")
> seiyu <- c("瀬戸麻沙美", "鈴木みのり")
> lis <- list(no, name)
> print(lis)
[[1]]
[1] 1 2
[[2]]
[1] "リフ" "セナディア"
> lis <- c(lis, list(seiyu = seiyu))
> print(lis)
[[1]]
[1] 1 2
[[2]]
[1] "リフ" "セナディア"
$seiyu
[1] "瀬戸麻沙美" "鈴木みのり"
> lis <- c(lis, list(`声優` = seiyu))
> print(lis)
[[1]]
[1] 1 2
[[2]]
[1] "リフ" "セナディア"
$seiyu
[1] "瀬戸麻沙美" "鈴木みのり"
$声優
[1] "瀬戸麻沙美" "鈴木みのり"

2024年12月10日 (火)

[R]リストを連結する

c関数を使う。

> lis1 <- list(1:2, c("リフ", "瀬戸麻沙美"))
> lis2 <- list(3:5, "スノウブレイク")
> lis1
[[1]]
[1] 1 2
[[2]]
[1] "リフ" "瀬戸麻沙美"
> lis2
[[1]]
[1] 3 4 5
[[2]]
[1] "スノウブレイク"
> lis <- c(lis1, lis2)
> lis
[[1]]
[1] 1 2
[[2]]
[1] "リフ" "瀬戸麻沙美"
[[3]]
[1] 3 4 5
[[4]]
[1] "スノウブレイク"

2024年12月 8日 (日)

[R]対角行列を作成する

diag関数を使う。第1引数に対角要素の値、第2引数に求める正方行列の次数を指定する。



> diag(4, 2)
[,1] [,2]
[1,] 4 0
[2,] 0 4
> diag(5, 3)
[,1] [,2] [,3]
[1,] 5 0 0
[2,] 0 5 0
[3,] 0 0 5
> diag(c(2, 4), 4)
[,1] [,2] [,3] [,4]
[1,] 2 0 0 0
[2,] 0 4 0 0
[3,] 0 0 2 0
[4,] 0 0 0 4

2024年12月 7日 (土)

[R]複数の引数を持つ関数の値の最小値(最大値)を求める

optim関数を使う。使用時には適切な初期値を与える必要がある。数値的に求めるため、必ずしも期待通りの結果が得られるわけではないので注意。

以下はf1とf2というそれぞれ2つずつ引数を持つ関数の最小値と最大値を求めた例。f1の値が最小となるのはf1(5, 7)、f2の値が最大値となるのはf2(5, 7)であることは明らか。optim関数はデフォルトでは関数の値が最小値となる引数を求めるが、最大値となる引数を求めたい場合はcontrolオプションにlist(fnscale = -1)を指定すること。

> f1 <- function(x) {(x[1] - 5) ^ 2 + (x[2] - 7) ^ 2}
> f2 <- function(x) {-((x[1] - 5) ^ 2 + (x[2] - 7) ^ 2)}
> r <- optim(c(0, 0), f1, method = "BFGS")
> print(r)
$par
[1] 5 7
$value
[1] 1.31369e-22
$counts
function gradient
12 3
$convergence
[1] 0
$message
NULL

f2関数の最小値は負の無限大であり、fnscaleに-1を指定しない状態では求めた引数(以下の$par)がまともに求まっていないことが明らか。fnscaleに-1を指定することで、期待通りの結果が得られる。

> r <- optim(c(0, 0), f2, method = "BFGS")
> print(r)
$par
[1] -4.758163e+13 -1.858368e+13
$value
[1] -2.609365e+27
$counts
function gradient
28 28
$convergence
[1] 0
$message
NULL
> r <- optim(c(0, 0), f2, method = "BFGS", control = list(fnscale = -1))
> print(r)
$par
[1] 5 7
$value
[1] -1.31369e-22
$counts
function gradient
12 3
$convergence
[1] 0
$message
NULL

2024年12月 6日 (金)

[R]タイムゾーンIDを一覧形式で得る

その環境下に搭載されているタイムゾーンを識別するID(タイムゾーンID)を一覧形式で得るには、OlsonNames関数を使う。

> OlsonNames()
[1] "Africa/Abidjan" "Africa/Accra"
[3] "Africa/Addis_Ababa" "Africa/Algiers"
[5] "Africa/Asmara" "Africa/Asmera"
(以下、表示省略)
> grep("Tokyo", OlsonNames())
[1] 322
> grep("Tokyo", OlsonNames(), value = TRUE)
[1] "Asia/Tokyo"

2024年12月 5日 (木)

[R]現在の環境のタイムゾーンを得る

Sys.timezone関数を使う。以下は、Windowsの日本語版バージョン4.3.1で実行した例。

> Sys.timezone()
[1] "Asia/Tokyo"

2024年12月 4日 (水)

[R]10進数を16進数に変換する

as.hexmode関数を使う。ベクトルを扱うことができる。戻り値は画面表示では文字列に見えるが、整数であることに注意。

> as.hexmode(0:15)
[1] "0" "1" "2" "3" "4" "5" "6" "7" "8" "9" "a" "b" "c" "d" "e" "f"
> as.hexmode(249:255)
[1] "f9" "fa" "fb" "fc" "fd" "fe" "ff"
> as.hexmode(13:16)
[1] "0d" "0e" "0f" "10"
> as.hexmode(13:16) + 1
[1] "0e" "0f" "10" "11"
> typeof(as.hexmode(13:16))
[1] "integer"

2024年12月 2日 (月)

[R]何か月後か調べる

seq関数とlength関数を組み合わせれば計算できる。以下の例では2024年1月16日を基準にして何か月後か調べた例。

> da <- as.Date("2024-01-16")
> length(seq(da, as.Date("2024-01-25"), by = "month")) - 1
[1] 0
> length(seq(da, as.Date("2024-02-25"), by = "month")) - 1
[1] 1
> length(seq(da, as.Date("2024-03-25"), by = "month")) - 1
[1] 2
> length(seq(da, as.Date("2025-03-25"), by = "month")) - 1
[1] 14

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

無料ブログはココログ

■■

■■■