potisanのプログラミングメモ

趣味のプログラマーがプログラミング関係で気になったことや調べたことをいつでも忘れられるようにメモするブログです。はてなブログ無料版なので記事の上の方はたぶん広告です。記事中にも広告挿入されるみたいです。

R&tidyverse tibbleの行を整数範囲で伸ばす

tidyverseのtibbleの行を整数範囲で伸ばす方法です。seq関数で作成した適当な整数範囲をtibbleにして、full_join関数で結合することで行を伸ばしています。full_joinの左側に整数範囲のtibbleを指定すれば順番が指定されるので、ついでに昇順並び替えと欠損値埋めもされます。

require(tidyverse)

df1 <- tribble(
  ~a, ~b, ~c,
   1,  1,  1,
   2,  2,  2,
   5,  5,  5,
   7,  7,  7)
df1
# # A tibble: 4 x 3
#       a     b     c
#   <dbl> <dbl> <dbl>
# 1     1     1     1
# 2     2     2     2
# 3     5     5     5
# 4     7     7     7

df2 <- full_join(tibble(a=seq(1:10)), df1)
df2
# # A tibble: 10 x 3
#        a     b     c
#    <dbl> <dbl> <dbl>
#  1     1     1     1
#  2     2     2     2
#  3     3    NA    NA
#  4     4    NA    NA
#  5     5     5     5
#  6     6    NA    NA
#  7     7     7     7
#  8     8    NA    NA
#  9     9    NA    NA
# 10    10    NA    NA

また、left_joinfull_joinの代わりに使うことで整数範囲以外の行を除去できます。この例では特に変化しません。

require(tidyverse)

df1 <- tribble(
  ~a, ~b, ~c,
   1,  1,  1,
   2,  2,  2,
   5,  5,  5,
   7,  7,  7)
df1
# # A tibble: 4 x 3
#       a     b     c
#   <dbl> <dbl> <dbl>
# 1     1     1     1
# 2     2     2     2
# 3     5     5     5
# 4     7     7     7

df2 <- left_join(tibble(a=seq(1:10)), df1)
df2
# # A tibble: 10 x 3
#        a     b     c
#    <dbl> <dbl> <dbl>
#  1     1     1     1
#  2     2     2     2
#  3     3    NA    NA
#  4     4    NA    NA
#  5     5     5     5
#  6     6    NA    NA
#  7     7     7     7
#  8     8    NA    NA
#  9     9    NA    NA
# 10    10    NA    NA