R(tidyverse)

2025年12月24日 (水)

[R]2つの列による重複を調べてその重複の数を表示する

tibbleを使用してgroup_by関数で重複を調べたい列を指定し、summarize関数に渡す。ただ渡すだけの場合は、重複する行を削除するだけになってしまうので、それぞれの重複の数を数えるためにsummarize関数内でn関数を使う。簡潔な表記にするため、画面表示はデータフレームで行っている。

> library(tidyverse)
> s1 <- c("AA", "AA", "AA", "AA", "BB", "BB", "BB", "CC", "CC")
> s2 <- c("aa", "aa", "aa", "bb", "bb", "bb", "cc", "cc", "dd")
> tib <- tibble(s1, s2)
> tib |> as.data.frame()
s1 s2
1 AA aa
2 AA aa
3 AA aa
4 AA bb
5 BB bb
6 BB bb
7 BB cc
8 CC cc
9 CC dd
> tib |> group_by(s1, s2) |> summarize() |> as.data.frame()
`summarise()` has grouped output by 's1'. You can override using the `.groups` argument.
s1 s2
1 AA aa
2 AA bb
3 BB bb
4 BB cc
5 CC cc
6 CC dd
> tib |> group_by(s1, s2) |> summarize(n = n()) |> as.data.frame()
`summarise()` has grouped output by 's1'. You can override using the `.groups` argument.
s1 s2 n
1 AA aa 3
2 AA bb 1
3 BB bb 2
4 BB cc 1
5 CC cc 1
6 CC dd 1
> tib |> group_by(s1, s2) |> summarize(n = n()) |> filter(n > 1) |> as.data.frame()
`summarise()` has grouped output by 's1'. You can override using the `.groups` argument.
s1 s2 n
1 AA aa 3
2 BB bb 2

2025年10月19日 (日)

[R]tibbleから指定した一列を取り出してベクトルにする

$演算子か[[ ]]演算子を使う。戻り値はベクトルになる。

> n <- c(11, 22, 33, 44)
> name <- c("イレイナ", "カナメ", "セナディア", "リフ")
> seiyu <- c("本渡楓", "安野希世乃", "鈴木みのり", "瀬戸麻沙美")
> tib <- tibble(n, name, seiyu)
> tib |> as.data.frame()
n name seiyu
1 11 イレイナ 本渡楓
2 22 カナメ 安野希世乃
3 33 セナディア 鈴木みのり
4 44 リフ 瀬戸麻沙美
> tib$seiyu
[1] "本渡楓" "安野希世乃" "鈴木みのり" "瀬戸麻沙美"
> tib[["seiyu"]]
[1] "本渡楓" "安野希世乃" "鈴木みのり" "瀬戸麻沙美"
> tib[[3]]
[1] "本渡楓" "安野希世乃" "鈴木みのり" "瀬戸麻沙美"
> tib |> pull(seiyu)
[1] "本渡楓" "安野希世乃" "鈴木みのり" "瀬戸麻沙美"

2025年10月14日 (火)

[R]tibbleを指定した列だけのtibbleに変換する

[ ]演算子を使う。取り出したい列を数値型ベクトルか文字列型ベクトルで指定する。行を指定する箇所は空欄にする。負数を指定すると、その列を取り除くという指定になる。最後の例のとおり、データフレームとは異なり、変換後に一列だけになってもtibbleを返すことに注意(データフレームの場合はベクトルに変わる)。以下では簡潔な表示にするため、データフレームに変換して表示している。

> library(tidyverse)
> n <- c(11, 22, 33, 44)
> name <- c("イレイナ", "カナメ", "セナディア", "リフ")
> seiyu <- c("本渡楓", "安野希世乃", "鈴木みのり", "瀬戸麻沙美")
> tib <- tibble(n, name, seiyu)
> tib |> as.data.frame()
n name seiyu
1 11 イレイナ 本渡楓
2 22 カナメ 安野希世乃
3 33 セナディア 鈴木みのり
4 44 リフ 瀬戸麻沙美
> tib[, 2:3] |> as.data.frame()
name seiyu
1 イレイナ 本渡楓
2 カナメ 安野希世乃
3 セナディア 鈴木みのり
4 リフ 瀬戸麻沙美
> tib[, -1] |> as.data.frame()
name seiyu
1 イレイナ 本渡楓
2 カナメ 安野希世乃
3 セナディア 鈴木みのり
4 リフ 瀬戸麻沙美
> tib[, c("seiyu", "name")] |> as.data.frame()
seiyu name
1 本渡楓 イレイナ
2 安野希世乃 カナメ
3 鈴木みのり セナディア
4 瀬戸麻沙美 リフ
> tib[, "seiyu"] |> as.data.frame()
seiyu
1 本渡楓
2 安野希世乃
3 鈴木みのり
4 瀬戸麻沙美

2025年10月13日 (月)

[R]tibbleを指定した行だけのtibbleに変換する

[ ]演算子を使う。取り出したい行を数値型ベクトルで指定する。列を指定する箇所は空欄にする。負数を指定すると、その行を取り除くという指定になる。以下の例では、簡潔な表示にするためにデータフレームに変換して表示している。

> library(tidyverse)
> n <- c(11, 22, 33, 44)
> name <- c("イレイナ", "カナメ", "セナディア", "リフ")
> seiyu <- c("本渡楓", "安野希世乃", "鈴木みのり", "瀬戸麻沙美")
> tib <- tibble(n, name, seiyu)
> tib |> as.data.frame()
n name seiyu
1 11 イレイナ 本渡楓
2 22 カナメ 安野希世乃
3 33 セナディア 鈴木みのり
4 44 リフ 瀬戸麻沙美
> tib[c(2, 4), ] |> as.data.frame()
n name seiyu
1 22 カナメ 安野希世乃
2 44 リフ 瀬戸麻沙美
> tib[c(-3), ] |> as.data.frame()
n name seiyu
1 11 イレイナ 本渡楓
2 22 カナメ 安野希世乃
3 44 リフ 瀬戸麻沙美

2025年7月17日 (木)

[R]tibbleの列名を得る

names関数を使う。tibbleを与えると、列名を文字型ベクトルで返す。以下はあらかじめ用意したtibbleで列名を取得した例。簡潔な表示にするため、tibbleの中身はデータフレームに変換して表示している。

> tib |> as.data.frame()
name seiyu
1 メレアーデ 石見舞菜香
2 ライスシャワー 石見舞菜香
3 マーシル 石見舞菜香
4 メイショウドトウ 和多田美咲
5 フィー 和多田美咲
6 リフ 瀬戸麻沙美
7 セナディア 鈴木みのり
> names(tib)
[1] "name" "seiyu"

2025年7月 8日 (火)

[R]tibbleから指定の列の値が重複する行を取り除く

distinct関数で列を指定すると、指定された列の重複を調べて、重複を取り除いたその列の値のだけを返す。.keep_allオプションにTRUEを指定すると、指定の列だけではなくすべての列の値を返す。返される列の値は行番号の数値が一番小さい行の値であり、任意の行を指定することはできない。tibbleの順番を逆にすると、行番号の数値が一番多い行の値を返すようになる。

> is_tibble(chara)
[1] TRUE
> chara |> as.data.frame()
name seiyu
1 セナディア 鈴木みのり
2 フィー 和多田美咲
3 マーシル 石見舞菜香
4 メイショウドトウ 和多田美咲
5 メレアーデ 石見舞菜香
6 ライスシャワー 石見舞菜香
7 リフ 瀬戸麻沙美
> chara |> distinct(seiyu) |> as.data.frame()
seiyu
1 鈴木みのり
2 和多田美咲
3 石見舞菜香
4 瀬戸麻沙美
> chara |> distinct(seiyu, .keep_all = TRUE) |> as.data.frame()
name seiyu
1 セナディア 鈴木みのり
2 フィー 和多田美咲
3 マーシル 石見舞菜香
4 リフ 瀬戸麻沙美
> chara[nrow(chara):1, ] |> distinct(seiyu, .keep_all = TRUE) |> as.data.frame()
name seiyu
1 リフ 瀬戸麻沙美
2 ライスシャワー 石見舞菜香
3 メイショウドトウ 和多田美咲
4 セナディア 鈴木みのり

2025年7月 7日 (月)

[R]tibbleの行を逆順に並び替える

nrow関数でそのtibbleの全行数を取得し、行のインデックスに全行数~1となる数値ベクトルを指定すればよい。以下は、あらかじめ用意したtibbleであるcharaで行を逆順に並び替えた例。簡潔な表示にするため、画面出力時にデータフレームに変換している。

> is_tibble(chara)
[1] TRUE
> chara |> as.data.frame()
name seiyu
1 セナディア 鈴木みのり
2 フィー 和多田美咲
3 マーシル 石見舞菜香
4 メイショウドトウ 和多田美咲
5 メレアーデ 石見舞菜香
6 ライスシャワー 石見舞菜香
7 リフ 瀬戸麻沙美
> chara[nrow(chara):1, ] |> as.data.frame()
name seiyu
1 リフ 瀬戸麻沙美
2 ライスシャワー 石見舞菜香
3 メレアーデ 石見舞菜香
4 メイショウドトウ 和多田美咲
5 マーシル 石見舞菜香
6 フィー 和多田美咲
7 セナディア 鈴木みのり

2025年5月23日 (金)

[R]指定した複数の列を基準にして2つのデータフレーム(tibble)が結合できるか否か調べる

dplyrパッケージのjoin_by関数に複数の結合の条件を指定してsemi_join関数、anti_join関数を使う。結合の条件を,(コンマ)で区切る。以下は、あらかじめ用意した二つのデータフレームを、結合できるか否か調べた例。

> dtf1
company title character
1 miHoYo 崩壊3rd セナディア
2 miHoYo 崩壊:スターレイル キャストリス
3 miHoYo 崩壊:スターレイル 帰望の流離人
4 miHoYo ゼンレスゾーンゼロ リン
5 KURO GAMES 鳴潮 カンタレラ
> dtf2
sakuhin kyara seiyu
1 崩壊3rd ヴィタ 日笠陽子
2 崩壊3rd セナディア 鈴木みのり
3 崩壊:スターレイル 帰望の流離人 高田憂希
4 ゼンレスゾーンゼロ アストラ 遠藤綾
5 鳴潮 カンタレラ 中原麻衣
> library(dplyr)

semi_join関数は、右側に指定の列の値が一致する行がある左側の行を返す。inner_join関数と動作は似ているが、semi_join関数は、結合はせずに結合可能な左側の行だけを返す。

> dtf1 |> inner_join(dtf2, by = join_by(title == sakuhin, character == kyara))
company title character seiyu
1 miHoYo 崩壊3rd セナディア 鈴木みのり
2 miHoYo 崩壊:スターレイル 帰望の流離人 高田憂希
3 KURO GAMES 鳴潮 カンタレラ 中原麻衣
> dtf1 |> semi_join(dtf2, by = join_by(title == sakuhin, character == kyara))
company title character
1 miHoYo 崩壊3rd セナディア
2 miHoYo 崩壊:スターレイル 帰望の流離人
3 KURO GAMES 鳴潮 カンタレラ

anti_join関数は、右側に指定の列の値が一致する行がない左側の行を返す。left_join関数では無理矢理結合されて列にNAが代入された行(以下の2,4行目)も返されるが、anti_join関数は結合はせずに左側の行だけを返す。

> dtf1 |> left_join(dtf2, by = join_by(title == sakuhin, character == kyara))
company title character seiyu
1 miHoYo 崩壊3rd セナディア 鈴木みのり
2 miHoYo 崩壊:スターレイル キャストリス <NA>
3 miHoYo 崩壊:スターレイル 帰望の流離人 高田憂希
4 miHoYo ゼンレスゾーンゼロ リン <NA>
5 KURO GAMES 鳴潮 カンタレラ 中原麻衣
> dtf1 |> anti_join(dtf2, by = join_by(title == sakuhin, character == kyara))
company title character
1 miHoYo 崩壊:スターレイル キャストリス
2 miHoYo ゼンレスゾーンゼロ リン

2025年5月22日 (木)

[R]指定した複数の列を基準にして二つのデータフレーム(tibble)を結合する

dplyrパッケージのjoin_by関数に複数の結合の条件を指定して~_join関数を使う。結合の条件は,(コンマ)で区切る。以下は、あらかじめ用意した二つのデータフレームを、左外部結合、右外部結合、完全外部結合、内部結合した例。

> dtf1
company title character
1 miHoYo 崩壊3rd セナディア
2 miHoYo 崩壊:スターレイル キャストリス
3 miHoYo 崩壊:スターレイル 帰望の流離人
4 miHoYo ゼンレスゾーンゼロ リン
5 KURO GAMES 鳴潮 カンタレラ
> dtf2
sakuhin kyara seiyu
1 崩壊3rd ヴィタ 日笠陽子
2 崩壊3rd セナディア 鈴木みのり
3 崩壊:スターレイル 帰望の流離人 高田憂希
4 ゼンレスゾーンゼロ アストラ 遠藤綾
5 鳴潮 カンタレラ 中原麻衣
> library(dplyr)
> # 左外部結合
> dtf1 |> left_join(dtf2, by = join_by(title == sakuhin, character == kyara))
company title character seiyu
1 miHoYo 崩壊3rd セナディア 鈴木みのり
2 miHoYo 崩壊:スターレイル キャストリス <NA>
3 miHoYo 崩壊:スターレイル 帰望の流離人 高田憂希
4 miHoYo ゼンレスゾーンゼロ リン <NA>
5 KURO GAMES 鳴潮 カンタレラ 中原麻衣
> # 右外部結合
> dtf1 |> right_join(dtf2, by = join_by(title == sakuhin, character == kyara))
company title character seiyu
1 miHoYo 崩壊3rd セナディア 鈴木みのり
2 miHoYo 崩壊:スターレイル 帰望の流離人 高田憂希
3 KURO GAMES 鳴潮 カンタレラ 中原麻衣
4 <NA> 崩壊3rd ヴィタ 日笠陽子
5 <NA> ゼンレスゾーンゼロ アストラ 遠藤綾
> # 完全外部結合
> dtf1 |> full_join(dtf2, by = join_by(title == sakuhin, character == kyara))
company title character seiyu
1 miHoYo 崩壊3rd セナディア 鈴木みのり
2 miHoYo 崩壊:スターレイル キャストリス <NA>
3 miHoYo 崩壊:スターレイル 帰望の流離人 高田憂希
4 miHoYo ゼンレスゾーンゼロ リン <NA>
5 KURO GAMES 鳴潮 カンタレラ 中原麻衣
6 <NA> 崩壊3rd ヴィタ 日笠陽子
7 <NA> ゼンレスゾーンゼロ アストラ 遠藤綾
> # 内部結合
> dtf1 |> inner_join(dtf2, by = join_by(title == sakuhin, character == kyara))
company title character seiyu
1 miHoYo 崩壊3rd セナディア 鈴木みのり
2 miHoYo 崩壊:スターレイル 帰望の流離人 高田憂希
3 KURO GAMES 鳴潮 カンタレラ 中原麻衣

2025年1月29日 (水)

[R]Apacheのログファイルの日付列から日付時刻型ベクトルを作成する

tidyverseパッケージを読み込むと読み込まれるlubridateパッケージのparse_date_time関数を使う。以下は15行からなるサンプルのApacheのログファイルを読み込み、日付列(4列目)を日付時刻型ベクトルに変換した例。

> library(tidyverse)
> options(readr.show_progress = FALSE, readr.show_col_types = FALSE)
> tib <- read_log("access.log")
> dim(tib)
[1] 15 9
> tib[, 1:6] |> as.data.frame()
X1 X2 X3 X4 X5 X6
1 192.168.12.2 NA NA 06/Dec/2024:23:51:07 +0900 GET / HTTP/1.1 200
2 192.168.12.2 NA NA 06/Dec/2024:23:51:07 +0900 GET /icons/ubuntu-logo.png HTTP/1.1 200
3 192.168.12.2 NA NA 06/Dec/2024:23:51:07 +0900 GET /favicon.ico HTTP/1.1 404
4 192.168.12.4 NA NA 06/Dec/2024:23:53:49 +0900 GET / HTTP/1.1 200
5 192.168.12.4 NA NA 06/Dec/2024:23:53:49 +0900 GET /icons/ubuntu-logo.png HTTP/1.1 200
6 192.168.12.4 NA NA 06/Dec/2024:23:53:49 +0900 GET /favicon.ico HTTP/1.1 404
7 192.168.12.4 NA NA 06/Dec/2024:23:54:23 +0900 GET / HTTP/1.1 200
8 192.168.12.4 NA NA 06/Dec/2024:23:54:23 +0900 GET /icons/ubuntu-logo.png HTTP/1.1 200
9 192.168.12.4 NA NA 06/Dec/2024:23:54:23 +0900 GET /favicon.ico HTTP/1.1 404
10 192.168.12.4 NA NA 06/Dec/2024:23:55:14 +0900 408
11 192.168.12.4 NA NA 06/Dec/2024:23:56:56 +0900 GET / HTTP/1.1 200
12 192.168.12.4 NA NA 06/Dec/2024:23:56:56 +0900 GET /icons/ubuntu-logo.png HTTP/1.1 200
13 192.168.12.4 NA NA 06/Dec/2024:23:56:56 +0900 GET /favicon.ico HTTP/1.1 404
14 192.168.12.4 NA NA 06/Dec/2024:23:57:04 +0900 GET / HTTP/1.1 200
15 192.168.12.4 NA NA 06/Dec/2024:23:57:55 +0900 408
> Sys.timezone()
[1] "Asia/Tokyo"
> parse_date_time(tib$X4, "%d/%m/%Y:%H:%M:%S %z")
[1] "2024-12-06 14:51:07 UTC" "2024-12-06 14:51:07 UTC" "2024-12-06 14:51:07 UTC"
[4] "2024-12-06 14:53:49 UTC" "2024-12-06 14:53:49 UTC" "2024-12-06 14:53:49 UTC"
[7] "2024-12-06 14:54:23 UTC" "2024-12-06 14:54:23 UTC" "2024-12-06 14:54:23 UTC"
[10] "2024-12-06 14:55:14 UTC" "2024-12-06 14:56:56 UTC" "2024-12-06 14:56:56 UTC"
[13] "2024-12-06 14:56:56 UTC" "2024-12-06 14:57:04 UTC" "2024-12-06 14:57:55 UTC"
> parse_date_time(tib$X4, "%d/%m/%Y:%H:%M:%S %z", tz = "Asia/Tokyo")
Date in ISO8601 format; converting timezone from UTC to "Asia/Tokyo".
[1] "2024-12-06 23:51:07 JST" "2024-12-06 23:51:07 JST" "2024-12-06 23:51:07 JST"
[4] "2024-12-06 23:53:49 JST" "2024-12-06 23:53:49 JST" "2024-12-06 23:53:49 JST"
[7] "2024-12-06 23:54:23 JST" "2024-12-06 23:54:23 JST" "2024-12-06 23:54:23 JST"
[10] "2024-12-06 23:55:14 JST" "2024-12-06 23:56:56 JST" "2024-12-06 23:56:56 JST"
[13] "2024-12-06 23:56:56 JST" "2024-12-06 23:57:04 JST" "2024-12-06 23:57:55 JST"
> dttm <- parse_date_time(tib$X4, "%d/%m/%Y:%H:%M:%S %z", tz = "Asia/Tokyo")
Date in ISO8601 format; converting timezone from UTC to "Asia/Tokyo".
> class(dttm)
[1] "POSIXct" "POSIXt"

上記のとおりparse_date_time関数は読み込んだ日付時刻を強制的にUTCと判断して変換する。そのため、読み込む際には明示的にタイムゾーンを指定する必要がある。変換された日付時刻型ベクトルのクラスはPOSIXctである。

より以前の記事一覧

無料ブログはココログ

■■

■■■