« 2022年2月 | トップページ | 2022年4月 »

2022年3月15日 (火)

[R]あらかじめ組み込まれている定数

Rにあらかじめ組み込まれている(起動直後に使える)定数は、5つある。

LETTERS(英大文字)
letters(英小文字)
month.abb(月名の略語)
month.name(月名)
pi(円周率)

> LETTERS
[1] "A" "B" "C" "D" "E" "F" "G" "H" "I" "J" "K" "L" "M" "N" "O"
[16] "P" "Q" "R" "S" "T" "U" "V" "W" "X" "Y" "Z"
> letters
[1] "a" "b" "c" "d" "e" "f" "g" "h" "i" "j" "k" "l" "m" "n" "o"
[16] "p" "q" "r" "s" "t" "u" "v" "w" "x" "y" "z"
> month.abb
[1] "Jan" "Feb" "Mar" "Apr" "May" "Jun" "Jul" "Aug" "Sep" "Oct"
[11] "Nov" "Dec"
> month.name
[1] "January" "February" "March" "April" "May"
[6] "June" "July" "August" "September" "October"
[11] "November" "December"
> pi
[1] 3.141593

これらはRでは、あらかじめ用意されているベクトルでしかなく、予約語ではない。よって、異なる値を代入することができる(書き換えることができる)ため、注意すること。

> pi
[1] 3.141593
> pi <- 3.13
> pi
[1] 3.13

2022年3月14日 (月)

[R]画像ファイルの一部分を切り出す

以下の関数を使えばよい。使い方は以下のとおり。

clipRa(ラスタ配列, 横方向の開始位置(1~), 縦~, 抜き出す幅, 抜き出す高さ)

いずれも指定の数値はピクセル単位で。

clipRa <- function(ra, xp, yp, wid, hei) {
rra <- array(0, dim = c(h, w, dim(ra)[3]))
xrg <- xp:min(dim(ra)[2], xp + w - 1)
yrg <- yp:min(dim(ra)[1], yp + h - 1)
zrg <- 1:dim(ra)[3]
rra <- array(0, dim = c(h, w, length(zrg)))
rra[yrg, xrg, zrg] <- ra[yrg, xrg, zrg]
return(rra)
}

使ってみる。

> library(png)
> ra <- readPNG("pngimage.png")
> ra1 <- clipRa(ra, 1, 1, 32, 64)
> writePNG(ra1, "clip1.png")
> ra2 <- clipRa(ra, 1, 1, 256, 256)
> writePNG(ra2, "clip2.png")

2022年3月13日 (日)

[R]画像ファイルを連結する

Rでは画像ファイルは配列(raster array、ラスタ配列)として扱う。各要素の型は数値。そのため、数値型の配列を操作することで、画像ファイルの連結を簡単に行うことができる。

以下が縦方向に連結する関数。

bindRra <- function(ra1, ra2) {
w1 <- dim(ra1)[2]
h1 <- dim(ra1)[1]
d1 <- dim(ra1)[3]
w2 <- dim(ra2)[2]
h2 <- dim(ra2)[1]
d2 <- dim(ra2)[3]
rra <- array(0, dim = c(h1 + h2, max(w1, w2), max(d1, d2)))
rra[1:h1, 1:w1, 1:d1] <- ra1[1:h1, 1:w1, 1:d1]
rra[(h1 + 1):(h1 + h2), 1:w2, 1:d2] <- ra2[1:h2, 1:w2, 1:d2]
return(rra)
}

以下が横方向に連結する関数。

bindCra <- function(ra1, ra2) {
w1 <- dim(ra1)[2]
h1 <- dim(ra1)[1]
d1 <- dim(ra1)[3]
w2 <- dim(ra2)[2]
h2 <- dim(ra2)[1]
d2 <- dim(ra2)[3]
rra <- array(0, dim = c(max(h1, h2), w1 + w2, max(d1, d2)))
rra[1:h1, 1:w1, 1:d1] <- ra1[1:h1, 1:w1, 1:d1]
rra[1:h2, (w1 + 1):(w1 + w2), 1:d2] <- ra2[1:h2, 1:w2, 1:d2]
return(rra)
}

以下の画像で試してみる。

pngimage.png

Pngimage

> library(png)
> ra <- readPNG("pngimage.png")
> ratate <- bindRra(ra, ra)
> writePNG(ratate, "tate.png")
> rayoko <- bindCra(ra, ra)
> writePNG(rayoko, "yoko.png")

tate.png

Tate

yoko.png

Yoko

2022年3月12日 (土)

[R]Excelの日付データをRの日付データに変換する

openxlsxパッケージなどを使ってExcelのファイルの日付データを読み込んだとき、日付データではなく数値データで読み込まれるときがある。これを読み込み元の日付相当の日付データに戻す場合は、as.Date関数にoriginオプションを付けて変換する。

Sheet1に以下のように入力したエクセルのファイルdata.xlsxを用意して試す。

Exceldate

> library(openxlsx)
> dtf <- read.xlsx("data.xlsx", colName = FALSE)
> dtf
X1 X2
1 44562 ← 書式を「日付」
2 44562 ← 書式を「標準」
> mode(dtf$X1)
[1] "numeric"
> class(dtf$X1)
[1] "numeric"
> as.Date(dtf$X1, origin = "1899-12-30")
[1] "2022-01-01" "2022-01-01"

Excelの日付データは、内部では一連の連番で保存しており、Windows版は1900年1月1日を1とした連番で管理している。1900年1月2日は翌日のため2となり、1901年1月1日は366日後に当たるため367となる(1900年は閏年)。つまり、値として基準になる日は1899年12月31日である。一方、as.Date関数では以下のとおりにoriginオプションに指定した日を基準としている。

> as.Date(0, origin = "1900-01-01")
[1] "1900-01-01"

そのため、読み取った値をas.Date関数で変換するときは、originオプションに1899年12月30日を指定すること。

2022年3月11日 (金)

[R]同じ値を繰り返してかつ連続したベクトルを作る

同じ値が連続したベクトルを作るにはrep関数を使うが、

> rep(1, 3)
[1] 1 1 1

同じ値が繰り返してかつ連続したベクトルを作るには(たとえば1,1,1,2,2,2,3,3,3,…)、rep関数にeachオプションを付けて使う。

> rep(1:3, 3)
[1] 1 2 3 1 2 3 1 2 3
> rep(1:3, 1, each = 3)
[1] 1 1 1 2 2 2 3 3 3

日付型も使える。

> dt1 <- as.Date("2022-01-01")
> dt2 <- as.Date("2022-01-03")
> rep(seq(dt1, dt2, by = "day"), 3)
[1] "2022-01-01" "2022-01-02" "2022-01-03"
[4] "2022-01-01" "2022-01-02" "2022-01-03"
[7] "2022-01-01" "2022-01-02" "2022-01-03"
> rep(seq(dt1, dt2, by = "day"), 1, each = 3)
[1] "2022-01-01" "2022-01-01" "2022-01-01"
[4] "2022-01-02" "2022-01-02" "2022-01-02"
[7] "2022-01-03" "2022-01-03" "2022-01-03"

2022年3月10日 (木)

[R]ベクトルから最大(最小)の値の要素のインデックスを得る

which.max(which.min)関数を使う。以下、例。

> n <- c(70, 60, 90, 80)
> max(n)
[1] 90
> min(n)
[1] 60
> which.max(n)
[1] 3
> which.min(n)
[1] 2

which.maxとwhich.min関数は、which関数を以下のように使った場合と同じ。

> which(n == max(n))
[1] 3
> which(n == min(n))
[1] 2

最大、最小の値が複数ある場合は、最小のインデックスが返される。

> n <- c(70, 60, 60, 80, 80)
> which.max(n)
[1] 4
> which.min(n)
[1] 2

2022年3月 8日 (火)

[R]リダイレクトを使う

dplyrパッケージを使う。

> head(as.double(ts(UKDriverDeaths)))
[1] 1687 1508 1507 1385 1632 1511
> as.double(ts(UKDriverDeaths)) %>% head()
as.double(ts(UKDriverDeaths)) %>% head() でエラー:
関数 "%>%" を見つけることができませんでした
> library(dplyr)
> as.double(ts(UKDriverDeaths)) %>% head()
[1] 1687 1508 1507 1385 1632 1511
> head() %<% as.double(ts(UKDriverDeaths))
head() %<% as.double(ts(UKDriverDeaths)) でエラー:
関数 "%<%" を見つけることができませんでした

 

2022年3月 7日 (月)

[Visual Basic]文字の全角半角を判定する

文字コードがシフトJISであれば(Windows 10の通常状態)、GetByteCountメソッドを使うことで簡単に判定できる。GetByteCountメソッドは引数に与えた文字列のバイト長を返すメソッドだが、一文字だけ与えれば、その文字が全角か半角かの判定に使うことができる。

いわゆる半角文字(ASCIIコードの0x20~0xFF)を与えれば1(整数型)を、全角文字(「あ」や「亜」)であれば2(整数型)を返す。

st = "ABあいうC"
For i = 0 To st.Length - 1
s = st.Substring(i, 1)
len = System.Text.Encoding.GetEncoding(932).GetByteCount(s)
Debug.Print(Str(i) & ": " & Str(len))
Next i

出力

 0:  1
1: 1
2: 2
3: 2
4: 2
5: 1

「A」や「B」は1バイト文字なので1、「あ」や「い」は2バイト文字なので2が返されていることがわかる。

2022年3月 6日 (日)

[R]ディレクトリ内のファイル一覧を得る

list.files関数を使う。pathオプションにはファイル一覧を取得するディレクトリを指定する。patternオプションに何も指定しないと全てのファイルを返す。特定のファイルのみを取得したい場合は、正規表現でファイル名のパターンを指定する。

以下は、とあるWindows 10環境下で行った例。

> list.files(path = "C:/Windows/Fonts")
[1] "8514fix.fon" "8514fixe.fon"
[3] "8514fixg.fon" "8514fixr.fon"
(以下、表示省略)
> list.files(path = "C:/Windows/Fonts", pattern = "^ms")
[1] "msgothic.ttc" "msjh.ttc" "msjhbd.ttc" "msjhl.ttc" "msmincho.ttc"
[6] "msyh.ttc" "msyhbd.ttc" "msyhl.ttc" "msyi.ttf"
> list.files(path = "C:/Windows/Fonts", pattern = "^japan")
character(0)

2022年3月 5日 (土)

[R]エクセルのファイル(.xlsx)の中身を読み込む

openxlsxパッケージのread.xlsx関数を使う。以下は、以下のような値が入力されているdata.xlsxファイルをカレントフォルダーに置いた場合の動作例。

Openxlsx

sheetオプションに読み込むシートの番号(連番)かシート名を指定する。存在しないシート名を指定すると読み込みに失敗する。デフォルトでは1行目をフィールド名として採用するため、不要な場合はcolNamesオプションをFALSEにする。デフォルトでは1行目から読み込むため、読み込みはじめの行を指定したい場合はstartRowオプションにその開始行を指定する。読み込まれたものはデータフレームになる。

> library("openxlsx")
> read.xlsx("data.xlsx", sheet = 1)
No 名前 体重
1 10 ABC 50.00
2 20 あいう 60.10
3 30 亜井宇 70.12
> read.xlsx("data.xlsx", sheet = "Sheet1")
No 名前 体重
1 10 ABC 50.00
2 20 あいう 60.10
3 30 亜井宇 70.12
> read.xlsx("data.xlsx", sheet = "Sheet2")
read.xlsx.default("data.xlsx", sheet = "Sheet2") でエラー:
Cannot find sheet named "Sheet2"
> read.xlsx("data.xlsx", sheet = 1, colNames = FALSE)
X1 X2 X3
1 No 名前 体重
2 10 ABC 50
3 20 あいう 60.1
4 30 亜井宇 70.12
> read.xlsx("data.xlsx", sheet = 1, startRow = 2)
10 ABC 50
1 20 あいう 60.10
2 30 亜井宇 70.12
> dtf <- read.xlsx("data.xlsx", sheet = 1)
> dtf
No 名前 体重
1 10 ABC 50.00
2 20 あいう 60.10
3 30 亜井宇 70.12
> mean(dtf$体重)
[1] 60.07333

2022年3月 4日 (金)

[C#]正規表現を使用して文字列の置き換えを行う

Replaceメソッドを使う。ただ文字列を置換するのではなく、パターンに含まれる文字列を使用して置き換えたい場合は、キャプチャによるグループ化を利用する。パターン内で( )(括弧)に挟まれた範囲はグループ化(キャプチャという)される。このグループには、キャプチャされた順番に1から始まる連番が付けられ、置換後の文字列で$1, $2, …と挿入することで、置換後の文字列に挿入することができる。

以下は、C#インタラクティブで、7桁の数字(○○○○○○○)を郵便番号の表記(○○○-○○○○)に置き換えた例。

> using System.Text.RegularExpressions;
> string s;
> s = Regex.Replace("1234567", "([0-9]{3})([0-9]{4})", "$1-$2");
> s
"123-4567"

2022年3月 3日 (木)

[R]データフレームを連結する(行の追加)

行の追加に相当するデータフレームの連結には、cbind関数を使う。連結するそれぞれのデータフレームは、フィールド数などが揃っていなければ連結することはできない。

> n1 <- c(2, 4, 6)
> n2 <- c(4, 16, 36)
> n3 <- c(3, 6, 9)
> n4 <- c(9, 36, 81)
> dtf1 <- data.frame(n1, n2)
> dtf1
n1 n2
1 2 4
2 4 16
3 6 36
> dtf2 <- data.frame(n3, n4)
> dtf2
n3 n4
1 3 9
2 6 36
3 9 81
> dtf <- cbind(dtf1, dtf2)
> dtf
n1 n2 n3 n4
1 2 4 3 9
2 4 16 6 36
3 6 36 9 81

« 2022年2月 | トップページ | 2022年4月 »

無料ブログはココログ

■■

■■■