Rで解析:データを範囲で操作する「ivs」パッケージ

Rの解析に役に立つ記事
スポンサーリンク

数字、日付データを始点(含抱)と終点(排他)を持つベクトルでデータを操作するパッケージの紹介です。パッケージには始点(含抱)と終点(排他)を持つベクトルを作成するコマンド、作成した範囲ベクトルを操作するコマンド、データ範囲の重複の位置や内容、データが範囲に含まれているか、その個数を確認するコマンドなどが収録されています。

コマンドを理解してしまえば「dplyr::mutate」コマンドなどと組み合わせて使用することでデータの整理が楽になると思います。

パッケージのバージョンは0.2.0。windows 11のR version 4.3.3で確認しています。

スポンサーリンク

パッケージのインストール

下記コマンドを実行してください。

# パッケージのインストール
install.packages("ivs")

コマンドの紹介

詳細はコマンド、パッケージのヘルプを確認してください。

# パッケージの読み込み
library("ivs")

# 範囲の始点(含抱),終点(排他)を持つベクトルを作成:ivコマンド
iv(start = 1:5, end = 10:14)
# <iv<integer>[5]>
# [1] [1, 10) [2, 11) [3, 12) [4, 13) [5, 14)

# 例_1
iv(start = as.Date("2024-06-17") + 0:2, end = as.Date("2024-06-19") + 0:2)
<iv<date>[3]>
[1] [2024-06-17, 2024-06-19) [2024-06-18, 2024-06-20) [2024-06-19, 2024-06-21)

# 例_2
iv(start = c(as.Date("2024-06-17"), as.Date("2024-06-19")), 
   end = c(as.Date("2024-06-18"), as.Date("2024-06-20")))
<iv<date>[2]>
[1] [2024-06-17, 2024-06-18) [2024-06-19, 2024-06-20)


# 範囲の始点(含抱),終点(排他)を持つ組み合わせのベクトルを作成:iv_pairsコマンド
iv_pairs(c(1, 5), c(2, 3), c(6, 10))
<iv<double>[3]>
[1] [1, 5)  [2, 3)  [6, 10)


# 範囲の重複の位置を確認する:iv_locate_overlapsコマンド
# 比較データはiv classで指定します
# needlesオプションの3番目c(6 ,10)の範囲がhaystackオプションの1番目c(7, 8)と重複
Iv_overlaps_result <- iv_locate_overlaps(needles = iv_pairs(c(1, 5), c(2, 3), c(6, 10)),
                                         haystack = iv_pairs(c(7, 8), c(12, 13), c(16, 20)))

# 確認
Iv_overlaps_result
  needles haystack
1       1       NA
2       2       NA
3       3        1


# 範囲の重複の内容を確認する:iv_alignコマンド
iv_align(needles = iv_pairs(c(1, 5), c(2, 3), c(6, 10)),
         haystack = iv_pairs(c(7, 8), c(12, 13), c(16, 20)),
         locations = Iv_overlaps_result)
# 確認
needles haystack
1  [1, 5) [NA, NA)
2  [2, 3) [NA, NA)
3 [6, 10)   [7, 8)

# 範囲の重複をTRUE/FALSEで確認する:iv_overlapsコマンド
iv_overlaps(needles = iv_pairs(c(1, 5), c(2, 3), c(6, 10)),
            haystack = iv_pairs(c(7, 8), c(12, 13), c(16, 20)))
[1] FALSE FALSE  TRUE

# needlesの範囲がどのhaystackの範囲の前にあるかを確認:iv_locate_precedesコマンド
# 結果の表示方法を指定:multipleオプション;"all","any","first","last"
iv_locate_precedes(needles = iv_pairs(c(1, 5), c(12, 13)),
                   haystack = iv_pairs(c(7, 8), c(16, 20)),
                   multiple = "all")
needles haystack
1       1        1
2       1        2
3       2        2

# needlesがhaystackの範囲に含まれるかをTRUE/FALSEで確認する:iv_betweenコマンド
iv_between(needles = c(5, 500),
           haystack = iv(450, 1000))
[1] FALSE  TRUE

## 例_1
iv_between(needles = c(as.Date("2024-06-18"),
                       as.Date("2024-06-20"),
                       as.Date("2024-05-18")),
           haystack = iv(start = as.Date("2024-06-17") + 0:2,
                         end = as.Date("2024-06-19") + 0:2))
[1]  TRUE  TRUE FALSE


# needlesがhaystackの範囲に含まれるかを確認する:iv_locate_betweenコマンド
between_result <- iv_locate_between(needles = c(as.Date("2024-06-18"),
                                                as.Date("2024-06-20"),
                                                as.Date("2024-05-18")),
                                    haystack = iv(start = as.Date("2024-06-17") + 0:2,
                                                  end = as.Date("2024-06-19") + 0:2))

## 結果をiv_alignコマンドに適応します
iv_align(needles = c(as.Date("2024-06-18"),
                     as.Date("2024-06-20"),
                     as.Date("2024-05-18")),
         haystack = iv(start = as.Date("2024-06-17") + 0:2,
                       end = as.Date("2024-06-19") + 0:2), 
         locations = between_result)
needles                 haystack
1 2024-06-18 [2024-06-17, 2024-06-19)
2 2024-06-18 [2024-06-18, 2024-06-20)
3 2024-06-20 [2024-06-19, 2024-06-21)
4 2024-05-18                 [NA, NA)


# 各haystackの範囲に各needlesの値が何度収まるか:iv_count_betweenコマンド
iv_count_between(needles = c(as.Date("2024-06-18"),
                             as.Date("2024-06-20"),
                             as.Date("2024-05-18")),
                 haystack = iv(start = as.Date("2024-06-17") + 0:2,
                               end = as.Date("2024-06-19") + 0:2))

# 解説_haystack範囲[1, 5),[4, 8)に3のneedlesが入るのは[1, 5)で結果は1
# iv_count_between(needles = c(3),
#                  haystack = iv(start = c(1, 4),
#                                end = c(5, 8)))


### 以降,使用するデータ例 #####
Test <- iv(start = as.Date("2024-06-17") + 0:2, end = as.Date("2024-06-19") + 0:2)
# 確認
Test
<iv<date>[3]>
[1] [2024-06-17, 2024-06-19) [2024-06-18, 2024-06-20) [2024-06-19, 2024-06-21)
########

# 範囲の始点を取得する:iv_startコマンド
iv_start(Test)
[1] "2024-06-17" "2024-06-18" "2024-06-19"


# 範囲の終点を取得する:iv_endコマンド
iv_end(Test)
[1] "2024-06-19" "2024-06-20" "2024-06-21"


# 範囲の重複をまとめて一つの範囲にする:iv_groupsコマンド
# Testの範囲は3つあるが実質の範囲は2024-06-17から2024-06-21まで
iv_groups(Test)
[1] [2024-06-17, 2024-06-21)


# 範囲の重複を重複範囲で分割する:iv_splitsコマンド
iv_splits(Test)
[1] [2024-06-17, 2024-06-18) [2024-06-18, 2024-06-19) [2024-06-19, 2024-06-20) [2024-06-20, 2024-06-21)

少しでも、あなたの解析が楽になりますように!!

タイトルとURLをコピーしました