R(tidyverse)

2024年4月 9日 (火)

[R]ある列の重複を除いた個数を調べる

group_by関数で列を指定してグループ化し、summarize関数で集計する。集計時にn関数を指定すると、その個数を返す。以下はあらかじめ用意したtibbleで実行した例。

> library(tidyverse)
> tib %>% as.data.frame()
nama title seiyu
1 ライスシャワー ウマ娘 岩見舞菜香
2 スーパークリーク ウマ娘 優木かな
3 メイショウドトウ ウマ娘 和多田美咲
4 フィー ライザのアトリエ2 和多田美咲
5 黒川あかね 推しの子 岩見舞菜香
> tib %>% group_by(title) %>% summarize(nn = n()) %>% as.data.frame()
title nn
1 ウマ娘 3
2 ライザのアトリエ2 1
3 推しの子 1
> tib %>% group_by(seiyu) %>% summarize(nn = n()) %>% as.data.frame()
seiyu nn
1 優木かな 1
2 和多田美咲 2
3 岩見舞菜香 2
グループ化には2つ以上の列を同時に指定することもできる。
> tib2 <- bind_rows(tib, slice(tib, c(1, 1, 3)))
> tib2 %>% as.data.frame()
nama title seiyu
1 ライスシャワー ウマ娘 岩見舞菜香
2 スーパークリーク ウマ娘 優木かな
3 メイショウドトウ ウマ娘 和多田美咲
4 フィー ライザのアトリエ2 和多田美咲
5 黒川あかね 推しの子 岩見舞菜香
6 ライスシャワー ウマ娘 岩見舞菜香
7 ライスシャワー ウマ娘 岩見舞菜香
8 メイショウドトウ ウマ娘 和多田美咲
> tib2 %>% group_by(title, seiyu) %>% summarize(nn = n()) %>% as.data.frame()
`summarise()` has grouped output by 'title'. You can override using the `.groups` argument.
title seiyu nn
1 ウマ娘 優木かな 1
2 ウマ娘 和多田美咲 2
3 ウマ娘 岩見舞菜香 3
4 ライザのアトリエ2 和多田美咲 1
5 推しの子 岩見舞菜香 1

2024年4月 7日 (日)

[R]tibbleで特殊な列名を使用して操作する

例えばASCIIの0~9で始まる名前は通常は列名に使用できないが、バックティック(`)で挟むと使用することができるようになる。

> library(tidyverse)
> tib <- tibble(21世紀 = 1:4)
エラー: 想定外のシンボルです ( "tib <- tibble(21世紀" の)
> tib <- tibble(`21世紀` = 1:4)
> tib %>% as.data.frame()
21世紀
1 1
2 2
3 3
4 4
> tib %>% filter(`21世紀` >= 3) %>% as.data.frame()
21世紀
1 3
2 4

2024年4月 6日 (土)

[R]tibbleの行に連番付け、順位付けを行う

連番付けにはrow_number関数、順位付けにはmin_rank関数かdense_rank関数を使う。

row_number関数は行に対して1から始まる連番を作成する。min_rank関数とdense_rank関数は順位付け関数であるが動作が異なり、min_rank関数は指定の列の値に同じ値があった場合は同位としてその次の順位を飛ばすが、dense_rank関数は同じ値があった場合は同位として次の順位は飛ばさない。最後の例のとおり、row_number関数は与えられたtibbleについて1行目から連番を割り当てるが、min_rank関数とdense_rank関数は指定された列の値に基づいて順位付けを行う。順位付けのデフォルトは昇順のため、これを降順にしたい場合は列を指定する際にdesc関数を使用する。

> library(tidyverse)
> tib <- tibble(n = c(20, 20, 30, 10, 40))
> tib %>% arrange(n) %>% mutate(row_number(), min_rank(n), dense_rank(n)) %>% as.data.frame()
n row_number() min_rank(n) dense_rank(n)
1 10 1 1 1
2 20 2 2 2
3 20 3 2 2
4 30 4 4 3
5 40 5 5 4
> tib %>% arrange(n) %>% mutate(row_number(), min_rank(desc(n)), dense_rank(desc(n))) %>% as.data.frame()
n row_number() min_rank(desc(n)) dense_rank(desc(n))
1 10 1 5 4
2 20 2 3 3
3 20 3 3 3
4 30 4 2 2
5 40 5 1 1
> tib %>% mutate(row_number(), min_rank(desc(n)), dense_rank(desc(n))) %>% as.data.frame()
n row_number() min_rank(desc(n)) dense_rank(desc(n))
1 20 1 3 3
2 20 2 3 3
3 30 3 2 2
4 10 4 5 4
5 40 5 1 1

2024年4月 5日 (金)

[R]tibbleから列の値が重複している行を抽出する

group_by関数で列を指定してグループ化し、filter関数とn関数を組み合わせてグループの行数が2以上の行を表示させればよい。最後の例のとおり、二つ以上の列を同時に指定することもできる。

> library(tidyverse)
> tib %>% as.data.frame()
name seiyu
1 ライスシャワー 石見舞菜香
2 ライスシャワー 石見舞菜香
3 メイショウドトウ 和多田美咲
4 メイショウドトウ (調査中)
5 サクラチヨノオー 野口瑠璃子
> tib %>% group_by(name) %>% filter(n() > 1) %>% as.data.frame()
name seiyu
1 ライスシャワー 石見舞菜香
2 ライスシャワー 石見舞菜香
3 メイショウドトウ 和多田美咲
4 メイショウドトウ (調査中)
> tib %>% group_by(name, seiyu) %>% filter(n() > 1) %>% as.data.frame()
name seiyu
1 ライスシャワー 石見舞菜香
2 ライスシャワー 石見舞菜香

2024年4月 4日 (木)

[R]列方向にtibbleを連結する

bind_cols関数を使う。最後の例のとおり、行数が揃わない場合は連結できない。

> library(tidyverse)
> no <- c(40, 45, 58)
> name <- c("ゴールドシチー", "スーパークリーク", "メイショウドトウ")
> seiyu <- c("香坂さき", "優木かな", "和多田美咲")
> tib1 <- tibble(no, name)
> tib2 <- tibble(seiyu)
> tib1 %>% as.data.frame()
no name
1 40 ゴールドシチー
2 45 スーパークリーク
3 58 メイショウドトウ
> tib2 %>% as.data.frame()
seiyu
1 香坂さき
2 優木かな
3 和多田美咲
> bind_cols(tib1, tib2) %>% as.data.frame()
no name seiyu
1 40 ゴールドシチー 香坂さき
2 45 スーパークリーク 優木かな
3 58 メイショウドトウ 和多田美咲
> tib3 <- tibble(seiyu = c("鈴木みのり", "石見舞菜香"))
> tib3 %>% as.data.frame()
seiyu
1 鈴木みのり
2 石見舞菜香
> bind_cols(tib1, tib3)
Error in `bind_cols()`:
! Can't recycle `..1` (size 3) to match `..2` (size 2).
Run `rlang::last_trace()` to see where the error occurred.

2024年4月 3日 (水)

[R]行方向にtibbleを連結する

bind_rows関数を使う。rbind関数と同様に列名を基準にして連結するため、列名の順は異なっていてもかまわない。なお、最後の例のとおり、rbind関数とは異なり列名が一致しない場合はNAを挿入して強制的に連結する。

> library(tidyverse)
> tib1 <- tibble(
+ no = c(40, 45),
+ name = c("ゴールドシチー", "スーパークリーク")
+ )
> tib2 <- tibble(
+ name = c("メイショウドトウ", "サクラチヨノオー"),
+ no = c(58, 69)
+ )
> tib1 %>% as.data.frame()
no name
1 40 ゴールドシチー
2 45 スーパークリーク
> tib2 %>% as.data.frame()
name no
1 メイショウドトウ 58
2 サクラチヨノオー 69
> bind_rows(tib1, tib2) %>% as.data.frame()
no name
1 40 ゴールドシチー
2 45 スーパークリーク
3 58 メイショウドトウ
4 69 サクラチヨノオー
> tib3 <- tibble(
+ no = c(58, 69),
+ seiyu = c("和多田美咲", "野口瑠璃子")
+ )
> tib3 %>% as.data.frame()
no seiyu
1 58 和多田美咲
2 69 野口瑠璃子
> bind_rows(tib1, tib3) %>% as.data.frame()
no name seiyu
1 40 ゴールドシチー <NA> 2 45 スーパークリーク <NA> 3 58 <NA> 和多田美咲
4 69 <NA> 野口瑠璃子

2024年3月16日 (土)

[R]二つのtibbleを一つに結合(内部結合)する

内部結合(結合すべき行がない行は出力しない結合)するには、inner_join関数を使う。以下はあらかじめ用意した二つのtibbleを内部結合した例。結合相手がない左側(tib1)の4行目と右側(tib2)の4行目は出力されていないことがわかる。

> library(tidyverse)
> tib1 %>% as.data.frame()
nama title no vc
1 ライスシャワー ウマ娘 30 miwami01
2 スーパークリーク ウマ娘 45 kyuki01
3 メイショウドトウ ウマ娘 58 mwatada01
4 ライザ ライザのアトリエ2 1 ynoguchi01
5 フィー ライザのアトリエ2 2 mwatada01
6 黒川あかね 推しの子 6 miwami01
> tib2 %>% as.data.frame()
id name
1 miwami01 岩見舞菜香
2 kyuki01 優木かな
3 mwatada01 和多田美咲
4 machico01 Machico
> tib1 %>% inner_join(tib2, by = join_by(vc == id)) %>% as.data.frame()
nama title no vc name
1 ライスシャワー ウマ娘 30 miwami01 岩見舞菜香
2 スーパークリーク ウマ娘 45 kyuki01 優木かな
3 メイショウドトウ ウマ娘 58 mwatada01 和多田美咲
4 フィー ライザのアトリエ2 2 mwatada01 和多田美咲
5 黒川あかね 推しの子 6 miwami01 岩見舞菜香

2024年3月15日 (金)

[R]二つのtibbleを一つに結合(完全外部結合)する

完全外部結合(左右すべての行を必ず出力する結合)するには、full_join関数を使う。以下はあらかじめ用意した二つのtibbleを完全外部結合した例。

> library(tidyverse)
> tib1 %>% as.data.frame()
nama title no vc
1 ライスシャワー ウマ娘 30 miwami01
2 スーパークリーク ウマ娘 45 kyuki01
3 メイショウドトウ ウマ娘 58 mwatada01
4 ライザ ライザのアトリエ2 1 ynoguchi01
5 フィー ライザのアトリエ2 2 mwatada01
6 黒川あかね 推しの子 6 miwami01
> tib2 %>% as.data.frame()
id name
1 miwami01 岩見舞菜香
2 kyuki01 優木かな
3 mwatada01 和多田美咲
4 machico01 Machico
> tib1 %>% full_join(tib2, by = join_by(vc == id)) %>% as.data.frame()
nama title no vc name
1 ライスシャワー ウマ娘 30 miwami01 岩見舞菜香
2 スーパークリーク ウマ娘 45 kyuki01 優木かな
3 メイショウドトウ ウマ娘 58 mwatada01 和多田美咲
4 ライザ ライザのアトリエ2 1 ynoguchi01
5 フィー ライザのアトリエ2 2 mwatada01 和多田美咲
6 黒川あかね 推しの子 6 miwami01 岩見舞菜香
7 <NA> <NA> NA machico01 Machico

2024年3月13日 (水)

[R]二つのtibbleを一つに結合(右外部結合)する

右外部結合(右側のすべての行を必ず出力する結合)するには、right_join関数を使う。以下はあらかじめ用意した二つのtibbleを右外部結合した例。右側(tib2)の4行目は左側(tib1)に結合相手が見つからないため、列にNAを挿入して6行目に出力されていることがわかる。

> library(tidyverse)
> tib1 %>% as.data.frame()
nama title no vc
1 ライスシャワー ウマ娘 30 miwami01
2 スーパークリーク ウマ娘 45 kyuki01
3 メイショウドトウ ウマ娘 58 mwatada01
4 ライザ ライザのアトリエ2 1 ynoguchi01
5 フィー ライザのアトリエ2 2 mwatada01
6 黒川あかね 推しの子 6 miwami01
> tib2 %>% as.data.frame()
id name
1 miwami01 岩見舞菜香
2 kyuki01 優木かな
3 mwatada01 和多田美咲
4 machico01 Machico
> tib1 %>% right_join(tib2, by = join_by(vc == id)) %>% as.data.frame()
nama title no vc name
1 ライスシャワー ウマ娘 30 miwami01 岩見舞菜香
2 スーパークリーク ウマ娘 45 kyuki01 優木かな
3 メイショウドトウ ウマ娘 58 mwatada01 和多田美咲
4 フィー ライザのアトリエ2 2 mwatada01 和多田美咲
5 黒川あかね 推しの子 6 miwami01 岩見舞菜香
6 <NA> <NA> NA machico01 Machico

2024年3月 6日 (水)

[R]二つのtibbleを一つに結合(左外部結合)する

左外部結合(左側のすべての行を必ず出力する結合)するには、left_join関数を使う。以下はあらかじめ用意した二つのtibbleを左外部結合した例。左側(tib1)の4行目は右側(tib2)に結合相手が見つからないため、列にNAを挿入して4行目に出力されていることがわかる。

> library(tidyverse)
> tib1 %>% as.data.frame()
nama title no vc
1 ライスシャワー ウマ娘 30 miwami01
2 スーパークリーク ウマ娘 45 kyuki01
3 メイショウドトウ ウマ娘 58 mwatada01
4 ライザ ライザのアトリエ2 1 ynoguchi01
5 フィー ライザのアトリエ2 2 mwatada01
6 黒川あかね 推しの子 6 miwami01
> tib2 %>% as.data.frame()
id name
1 miwami01 岩見舞菜香
2 kyuki01 優木かな
3 mwatada01 和多田美咲
4 machico01 Machico
> tib1 %>% left_join(tib2, by = join_by(vc == id)) %>% as.data.frame()
nama title no vc name
1 ライスシャワー ウマ娘 30 miwami01 岩見舞菜香
2 スーパークリーク ウマ娘 45 kyuki01 優木かな
3 メイショウドトウ ウマ娘 58 mwatada01 和多田美咲
4 ライザ ライザのアトリエ2 1 ynoguchi01 <NA> 5 フィー ライザのアトリエ2 2 mwatada01 和多田美咲
6 黒川あかね 推しの子 6 miwami01 岩見舞菜香