[R]文字列型ベクトルを作成する
文字列を二重引用符”で囲んで文字列リテラルを作り、c関数でベクトル化して代入演算子<-で代入する。
> s <- "ABC"
> print(s)
[1] "ABC"
> s <- c("ABC", "あいう", "阿伊宇abc")
> print(s)
[1] "ABC" "あいう" "阿伊宇abc"
« 2022年5月 | トップページ | 2022年7月 »
文字列を二重引用符”で囲んで文字列リテラルを作り、c関数でベクトル化して代入演算子<-で代入する。
> s <- "ABC"
> print(s)
[1] "ABC"
> s <- c("ABC", "あいう", "阿伊宇abc")
> print(s)
[1] "ABC" "あいう" "阿伊宇abc"
if文ではなくifelse関数を使う。以下、例。
> n <- 1:5
> n
[1] 1 2 3 4 5
> ifelse(n >= 3, "Yes", "No")
[1] "No" "No" "Yes" "Yes" "Yes"
> if (n >= 3) "Yes" else "No"
[1] "No"
警告メッセージ:
if (n >= 3) "Yes" else "No" で:
条件が長さが 2 以上なので、最初の 1 つだけが使われます
最後の例のとおり、通常のif分はベクトルの最初の要素しか扱われない。
grep関数のinvertオプションを使う。
> s <- c("A", "B", "C", "D")
> s
[1] "A" "B" "C" "D"
> grep("B", s)
[1] 2
> grep("B", s, invert = TRUE)
[1] 1 3 4
> grep("B", s, invert = TRUE, value = TRUE)
[1] "A" "C" "D"
ソースコードが書かれたファイルを適切な文字コードで保存をしていない。Windows版Octaveは初期状態ではUTF-8を扱う設定になっているため、ソースファイルをUTF-8で保存し直す。以下、実験。
以下の2行をテキストエディタに貼り付けてシフトJISで保存をする。
% 日本語
fprintf("ABCあいうXYZ\n")
GUI版で実行してみる。
>> nihongo
warning: Invalid UTF-8 byte sequences have been replaced.
warning: Invalid UTF-8 byte sequences have been replaced.
ABC■■■XYZ
エラーメッセージが表示される。ソースファイルをUTF-8で保存し直して同じように実行する
>> nihongo
ABCああいいううXYZ
警告メッセージは表示されなくなったが、表示がおかしい。現在の最新版のOctaveはマルチバイト文字の処理がうまく行えず、日本語をうまく表示することはできない。
なお、テキストファイルはシフトJISのままで、
と設定し、同じように動作させると、
>> nihongo
ABCああいいううXYZ¥n>>
警告メッセージは表示されなくなったが、依然表示がおかしくマルチバイト文字の処理がうまく行えていないことがわかる。これらはCLI版でも同様である。
非数(NA)はその名のとおり数としては扱えない値であり、算術関数はNAが1つでも含まれていると、正常に動作しない。
> d <- c(20, 30, NA, 5)
> mean(d)
[1] NA
> max(d)
[1] NA
これを正常に動作させるには、is.na関数を使用してNAの要素を取り除けばよい。is.na関数は引数に与えたベクトルの要素がNAであればTRUE、そうでなければFALSEを返す。これを利用して、処理するベクトルの要素番号を指定して当該関数に与えればよい。
> is.na(d)
[1] FALSE FALSE TRUE FALSE
> d[!is.na(d)]
[1] 20 30 5
> mean(d[!is.na(d)])
[1] 18.33333
> max(d[!is.na(d)])
[1] 30
tidyverseパッケージに含まれているため、このパッケージの使用を宣言すればよい。tibbleとはデータフレームを使いやすくしたようなもので、データフレームとほぼ同じように扱うことができる。
> library(tidyverse)
> n <- 1:3
> s <- c("A", "B", "C")
> d <- c(1.5, 2.5, 3.6)
> tbl <- tibble(n, s, d)
> tbl
# A tibble: 3 x 3
n s d
1 1 A 1.5
2 2 B 2.5
3 3 C 3.6
> tbl <- as_tibble(data.frame(n, s, d))
> tbl
# A tibble: 3 x 3
n s d
1 1 A 1.5
2 2 B 2.5
3 3 C 3.6
> tbl[2, 3]
# A tibble: 1 x 1
d
1 2.5
> tbl[1, ]
# A tibble: 1 x 3
n s d
1 1 A 1.5
> tbl[, 2]
# A tibble: 3 x 1
s
1 A
2 B
3 C
update.packages関数を使う。アップデートできるパッケージがある場合は、パッケージ1つごとに、アップデートするか否かの確認のダイアログが表示される。
> update.packages()
その環境で使用中(library関数で使用を宣言しているパッケージ)のパッケージはアップデートされないので注意。
old.packages関数を使う。アップデートできるパッケージがある場合は、それらが表示される。
> old.packages()
ここではバージョン番号を比較して表示しているだけであり、パッケージや環境によっては、あえてアップデートされない場合があるので注意。
あくまで表示されるだけで、実際にアップデートをする場合はupdate.packages関数を使う。
readxlパッケージのread_xls関数を使う。readxlパッケージはその関数利用時にR以外のソフトウェアを必要としないため、パッケージをインストールすれば、そのまま使うことができる。よくネットで見かけるopenxlsxパッケージはxlsを扱うことはできない。
この関数の戻り値はtibble型。data.frame型とほぼ同じように扱うことができる。
以下のようなxlsファイルがあり、カレントディレクトリにsample.xlsというファイル名で保存した状態での動作例。オプションで特に指定をしなければ1行目をフィールド名として採用する。データが1行目から始まる場合はcol_namesオプションにFALSEを指定する。読み込ませる列(A~IV)を指定する場合はrangeにcell_colsを使用して指定する。各フィールドのデータ型は未指定では自動的にデータ型の類推(guess)がなされて決まるが、これを指定の型にしたい場合はcol_typesオプションに、ベクトルで順番に指定をする。
> library(readxl)
> tbl <- read_xls("sample.xls")
> tbl
# A tibble: 4 x 4
no name date age
1 1 A 2022-01-01 00:00:00 10
2 2 B 2022-02-02 00:00:00 20
3 3 C 2022-03-03 00:00:00 30
4 4 D 2022-05-05 00:00:00 40
> tbl <- read_xls("sample.xls", col_names = FALSE)
New names:
* `` -> `...1`
* `` -> `...2`
* `` -> `...3`
* `` -> `...4`
> tbl
# A tibble: 5 x 4
...1 ...2 ...3 ...4
1 no name date age
2 1 A 44562 10
3 2 B 44594 20
4 3 C 44623 30
5 4 D 44686 40
> tbl <- read_xls("sample.xls", range = cell_cols("B:D"))
> tbl
# A tibble: 4 x 3
name date age
1 A 2022-01-01 00:00:00 10
2 B 2022-02-02 00:00:00 20
3 C 2022-03-03 00:00:00 30
4 D 2022-05-05 00:00:00 40
> tbl <- read_xls("sample.xls", col_types = c("guess", "text", "text", "numeric"))
> tbl
# A tibble: 4 x 4
no name date age
1 1 A 44562 10
2 2 B 44594 20
3 3 C 44623 30
4 4 D 44686 40
> tbl <- read_xls("sample.xls", col_types = c("guess", "text", "date", "numeric"))
> tbl
# A tibble: 4 x 4
no name date age
1 1 A 2022-01-01 00:00:00 10
2 2 B 2022-02-02 00:00:00 20
3 3 C 2022-03-03 00:00:00 30
4 4 D 2022-05-05 00:00:00 40