次のような例で悩んだのでメモしておきます.
前提
日付(date
),ID(id
),値(value
)のあるデータフレーム(df
)を想定します.同じ日付データが複数あり,更にそれに対して付与されるID,値も異なるとします.
require(tidyverse)
require(lubridate)
set.seed(1)
iter <- 5 # 適当な値
date <- ymd(rep(20170101:20170110, each = iter)) # 日付
id <- sample(1:2, iter * 10, replace = TRUE) # ID
value <- rnorm(iter * 10) # 値
df <- tibble(date, id, value) #データフレーム
df
#> # A tibble: 50 × 3
#> date id value
#> <date> <int> <dbl>
#> 1 2017-01-01 1 -0.05612874
#> 2 2017-01-01 1 -0.15579551
#> 3 2017-01-01 2 -1.47075238
#> 4 2017-01-01 2 -0.47815006
#> 5 2017-01-01 1 0.41794156
#> 6 2017-01-02 2 1.35867955
#> 7 2017-01-02 2 -0.10278773
#> 8 2017-01-02 2 0.38767161
#> 9 2017-01-02 2 -0.05380504
#> 10 2017-01-02 1 -1.37705956
#> # ... with 40 more rows
やりたいこと
日付毎に最も多く現れるIDのデータだけを残したいとします.
非常に強引ですが,次のように書くことで抽出できます.
df %>%
group_by(date, id) %>% # 日付,IDでグループ化
count() %>% # グループ毎の個数をカウント,列"n"ができる
top_n(1, n) %>% # n列について,1番大きな値だけを抽出する
ungroup() %>%
right_join(., df, by = c("date", "id")) %>% #日付,IDで結合(右側のdfを残す)
na.omit() %>%
select(-n) # 余分なn列を消す
#> # A tibble: 34 × 3
#> date id value
#> <date> <int> <dbl>
#> 1 2017-01-01 1 -0.05612874
#> 2 2017-01-01 1 -0.15579551
#> 3 2017-01-01 1 0.41794156
#> 4 2017-01-02 2 1.35867955
#> 5 2017-01-02 2 -0.10278773
#> 6 2017-01-02 2 0.38767161
#> 7 2017-01-02 2 -0.05380504
#> 8 2017-01-03 1 -0.41499456
#> 9 2017-01-03 1 -0.39428995
#> 10 2017-01-03 1 1.10002537
#> # ... with 24 more rows
もっとよいやり方があると思うのですが,わかりませんでした.
お分かりになる方はご教示いただければ幸いです.