Rのデータフレームの行操作についてのメモ - Qiita (2024)

Rのデータフレームの行の操作について、サンプルデータを用いて具体的に練習してみました。

目次

  • Rのデータフレームの行についての操作
    • 練習に用いるデータ
    • slice():行の番号抽出
      • slice_head(), slice_tail():先頭のn行・末尾のn行抽出
      • slice_max(), slice_min():最大のn行・最小のn行抽出
      • slice_sample():行のサンプリング抽出
    • filter():行の条件抽出
      • is.na():NAかどうか
      • %in%
      • between()
      • near():計算誤差込みの等号
      • str_detect():文字列の条件抽出
    • filter(if_all()), filter(if_any()):複数列にわたる条件での行の抽出
      • where()
    • arrange():行の並び替え
    • distinct():行の重複削除
    • group_by():グループ化
      • ungroup():グループ化の解除
    • drop_na():NAの行の削除
    • complete(), expand():列の値のすべての組み合わせからなる行の作成
    • rowid_to_column(), rownames_to_column():行番号・行名を列名に
    • column_to_rownames():列名を行名に
  • 参考

Rのデータフレームの行の操作について、サンプルデータを用いて具体的に練習します。
なお、以下については別記事でまとめています。
- 列の操作について:こちら
- 集計操作について:こちら
- pivot操作について:こちら
- データフレームの関数について:こちら

dplyr
tidyr

参考:
https://r4ds.had.co.nz/transform.html
https://github.com/tidyverse/dplyr
https://heavywatal.github.io/rstats/dplyr.html

練習に用いるデータ

Rのサンプルデータirisanscombeを用います。
行番号を表示した方が分かりやすいため、tibble::rowid_to_column()で行番号を列名にしています。
こちらの記事と同じデータを用います。)

R

library(dplyr)library(tibble)library(tidyr)iris# 行番号を列名にiris_tbl <- iris %>% as_tibble() %>% rowid_to_column("id")iris_tbl# # A tibble: 150 x 6# id Sepal.Length Sepal.Width Petal.Length Petal.Width Species# <int> <dbl> <dbl> <dbl> <dbl> <fct> # 1 1 5.1 3.5 1.4 0.2 setosa # 2 2 4.9 3 1.4 0.2 setosa # 3 3 4.7 3.2 1.3 0.2 setosa # 4 4 4.6 3.1 1.5 0.2 setosa # 5 5 5 3.6 1.4 0.2 setosa # 6 6 5.4 3.9 1.7 0.4 setosa # 7 7 4.6 3.4 1.4 0.3 setosa # 8 8 5 3.4 1.5 0.2 setosa # 9 9 4.4 2.9 1.4 0.2 setosa # 10 10 4.9 3.1 1.5 0.1 setosa # # ... with 140 more rowsanscombeanscombe_tbl <- anscombe %>% as_tibble() %>% rowid_to_column("id")anscombe_tbl# # A tibble: 11 x 9# id x1 x2 x3 x4 y1 y2 y3 y4# <int> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl># 1 1 10 10 10 8 8.04 9.14 7.46 6.58# 2 2 8 8 8 8 6.95 8.14 6.77 5.76# 3 3 13 13 13 8 7.58 8.74 12.7 7.71# 4 4 9 9 9 8 8.81 8.77 7.11 8.84# 5 5 11 11 11 8 8.33 9.26 7.81 8.47# 6 6 14 14 14 8 9.96 8.1 8.84 7.04# 7 7 6 6 6 8 7.24 6.13 6.08 5.25# 8 8 4 4 4 19 4.26 3.1 5.39 12.5 # 9 9 12 12 12 8 10.8 9.13 8.15 5.56# 10 10 7 7 7 8 4.82 7.26 6.42 7.91# 11 11 5 5 5 8 5.68 4.74 5.73 6.89

slice():行の番号抽出

行を行番号で抽出します。

R

# slice()iris_tbl %>% slice(c(1, 3, 5))# # A tibble: 3 x 6# id Sepal.Length Sepal.Width Petal.Length Petal.Width Species# <int> <dbl> <dbl> <dbl> <dbl> <fct> # 1 1 5.1 3.5 1.4 0.2 setosa # 2 3 4.7 3.2 1.3 0.2 setosa # 3 5 5 3.6 1.4 0.2 setosa iris_tbl %>% slice(11:15)# # A tibble: 5 x 6# id Sepal.Length Sepal.Width Petal.Length Petal.Width Species# <int> <dbl> <dbl> <dbl> <dbl> <fct> # 1 11 5.4 3.7 1.5 0.2 setosa # 2 12 4.8 3.4 1.6 0.2 setosa # 3 13 4.8 3 1.4 0.1 setosa # 4 14 4.3 3 1.1 0.1 setosa # 5 15 5.8 4 1.2 0.2 setosa iris_tbl %>% slice(seq(1, 50, 10))# # A tibble: 5 x 6# id Sepal.Length Sepal.Width Petal.Length Petal.Width Species# <int> <dbl> <dbl> <dbl> <dbl> <fct> # 1 1 5.1 3.5 1.4 0.2 setosa # 2 11 5.4 3.7 1.5 0.2 setosa # 3 21 5.4 3.4 1.7 0.2 setosa # 4 31 4.8 3.1 1.6 0.2 setosa # 5 41 5 3.5 1.3 0.3 setosa c(1, 3, 5)# [1] 1 3 511:15# [1] 11 12 13 14 15seq(1, 50, 10)# [1] 1 11 21 31 41

group_by()でグループ化しておくと、グループごとに番号抽出できます。

R

iris_tbl %>% group_by(Species) %>% slice(c(1, 3, 5))# # A tibble: 9 x 6# # Groups: Species [3]# id Sepal.Length Sepal.Width Petal.Length Petal.Width Species # <int> <dbl> <dbl> <dbl> <dbl> <fct> # 1 1 5.1 3.5 1.4 0.2 setosa # 2 3 4.7 3.2 1.3 0.2 setosa # 3 5 5 3.6 1.4 0.2 setosa # 4 51 7 3.2 4.7 1.4 versicolor# 5 53 6.9 3.1 4.9 1.5 versicolor# 6 55 6.5 2.8 4.6 1.5 versicolor# 7 101 6.3 3.3 6 2.5 virginica # 8 103 7.1 3 5.9 2.1 virginica # 9 105 6.5 3 5.8 2.2 virginica 

slice_head(), slice_tail():先頭のn行・末尾のn行抽出

先頭のn行、末尾のn行を抽出します。n行(行数)の代わりに割合指定もできます。
グループ化しておくと、グループごとにn行抽出できます。

R

# slice_head(), slice_tail()iris_tbl %>% slice_head(n = 2)# # A tibble: 2 x 6# id Sepal.Length Sepal.Width Petal.Length Petal.Width Species# <int> <dbl> <dbl> <dbl> <dbl> <fct> # 1 1 5.1 3.5 1.4 0.2 setosa # 2 2 4.9 3 1.4 0.2 setosa iris_tbl %>% slice_head(prop = 0.02)# # A tibble: 3 x 6# id Sepal.Length Sepal.Width Petal.Length Petal.Width Species# <int> <dbl> <dbl> <dbl> <dbl> <fct> # 1 1 5.1 3.5 1.4 0.2 setosa # 2 2 4.9 3 1.4 0.2 setosa # 3 3 4.7 3.2 1.3 0.2 setosa# 150 * 0.02 == 3iris_tbl %>% slice_tail(n = 2)# # A tibble: 2 x 6# id Sepal.Length Sepal.Width Petal.Length Petal.Width Species # <int> <dbl> <dbl> <dbl> <dbl> <fct> # 1 149 6.2 3.4 5.4 2.3 virginica# 2 150 5.9 3 5.1 1.8 virginicairis_tbl %>% slice_tail(prop = 0.02)# # A tibble: 3 x 6# id Sepal.Length Sepal.Width Petal.Length Petal.Width Species # <int> <dbl> <dbl> <dbl> <dbl> <fct> # 1 148 6.5 3 5.2 2 virginica# 2 149 6.2 3.4 5.4 2.3 virginica# 3 150 5.9 3 5.1 1.8 virginicairis_tbl %>% group_by(Species) %>% slice_head(n = 2)# # A tibble: 6 x 6# # Groups: Species [3]# id Sepal.Length Sepal.Width Petal.Length Petal.Width Species # <int> <dbl> <dbl> <dbl> <dbl> <fct> # 1 1 5.1 3.5 1.4 0.2 setosa # 2 2 4.9 3 1.4 0.2 setosa # 3 51 7 3.2 4.7 1.4 versicolor# 4 52 6.4 3.2 4.5 1.5 versicolor# 5 101 6.3 3.3 6 2.5 virginica # 6 102 5.8 2.7 5.1 1.9 virginica 

slice_max(), slice_min():最大のn行・最小のn行抽出

最大のn行、最小のn行を抽出します。n行(行数)の代わりに割合指定もできます。
グループ化しておくと、グループごとにn行抽出できます。

R

# slice_max(), slice_min()iris_tbl %>% slice_max(Sepal.Length, n = 2)# # A tibble: 5 x 6# id Sepal.Length Sepal.Width Petal.Length Petal.Width Species # <int> <dbl> <dbl> <dbl> <dbl> <fct> # 1 132 7.9 3.8 6.4 2 virginica# 2 118 7.7 3.8 6.7 2.2 virginica# 3 119 7.7 2.6 6.9 2.3 virginica# 4 123 7.7 2.8 6.7 2 virginica# 5 136 7.7 3 6.1 2.3 virginica# Sepal.Lengthが2番目に大きいもの(7.7)が4個あるため、結果として5行出力されるiris_tbl %>% slice_max(Sepal.Length, prop = 0.02)# # A tibble: 5 x 6# id Sepal.Length Sepal.Width Petal.Length Petal.Width Species # <int> <dbl> <dbl> <dbl> <dbl> <fct> # 1 132 7.9 3.8 6.4 2 virginica# 2 118 7.7 3.8 6.7 2.2 virginica# 3 119 7.7 2.6 6.9 2.3 virginica# 4 123 7.7 2.8 6.7 2 virginica# 5 136 7.7 3 6.1 2.3 virginicairis_tbl %>% slice_min(Sepal.Length, n = 2)# # A tibble: 4 x 6# id Sepal.Length Sepal.Width Petal.Length Petal.Width Species# <int> <dbl> <dbl> <dbl> <dbl> <fct> # 1 14 4.3 3 1.1 0.1 setosa # 2 9 4.4 2.9 1.4 0.2 setosa # 3 39 4.4 3 1.3 0.2 setosa # 4 43 4.4 3.2 1.3 0.2 setosa iris_tbl %>% slice_min(Sepal.Length, prop = 0.02)# # A tibble: 4 x 6# id Sepal.Length Sepal.Width Petal.Length Petal.Width Species# <int> <dbl> <dbl> <dbl> <dbl> <fct> # 1 14 4.3 3 1.1 0.1 setosa # 2 9 4.4 2.9 1.4 0.2 setosa # 3 39 4.4 3 1.3 0.2 setosa # 4 43 4.4 3.2 1.3 0.2 setosa iris_tbl %>% group_by(Species) %>% slice_max(Sepal.Length, n = 2)# # A tibble: 10 x 6# # Groups: Species [3]# id Sepal.Length Sepal.Width Petal.Length Petal.Width Species # <int> <dbl> <dbl> <dbl> <dbl> <fct> # 1 15 5.8 4 1.2 0.2 setosa # 2 16 5.7 4.4 1.5 0.4 setosa # 3 19 5.7 3.8 1.7 0.3 setosa # 4 51 7 3.2 4.7 1.4 versicolor# 5 53 6.9 3.1 4.9 1.5 versicolor# 6 132 7.9 3.8 6.4 2 virginica # 7 118 7.7 3.8 6.7 2.2 virginica # 8 119 7.7 2.6 6.9 2.3 virginica # 9 123 7.7 2.8 6.7 2 virginica # 10 136 7.7 3 6.1 2.3 virginica iris_tbl %>% group_by(Species) %>% slice_min(Sepal.Length, n = 2)# # A tibble: 9 x 6# # Groups: Species [3]# id Sepal.Length Sepal.Width Petal.Length Petal.Width Species # <int> <dbl> <dbl> <dbl> <dbl> <fct> # 1 14 4.3 3 1.1 0.1 setosa # 2 9 4.4 2.9 1.4 0.2 setosa # 3 39 4.4 3 1.3 0.2 setosa # 4 43 4.4 3.2 1.3 0.2 setosa # 5 58 4.9 2.4 3.3 1 versicolor# 6 61 5 2 3.5 1 versicolor# 7 94 5 2.3 3.3 1 versicolor# 8 107 4.9 2.5 4.5 1.7 virginica # 9 122 5.6 2.8 4.9 2 virginica 

slice_sample():行のサンプリング抽出

行のサンプリング抽出をします。
グループ化しておくと、グループごとにサンプリングできます。

R

# slice_sample()set.seed(1) # 乱数のシードの固定iris_tbl %>% slice_sample(n = 2) # 非復元抽出(デフォルト)# # A tibble: 2 x 6# id Sepal.Length Sepal.Width Petal.Length Petal.Width Species # <int> <dbl> <dbl> <dbl> <dbl> <fct> # 1 68 5.8 2.7 4.1 1 versicolor# 2 129 6.4 2.8 5.6 2.1 virginica set.seed(1) # 乱数のシードの固定iris_tbl %>% slice_sample(n = 2, replace = TRUE) # 復元抽出# # A tibble: 2 x 6# id Sepal.Length Sepal.Width Petal.Length Petal.Width Species # <int> <dbl> <dbl> <dbl> <dbl> <fct> # 1 68 5.8 2.7 4.1 1 versicolor# 2 129 6.4 2.8 5.6 2.1 virginica set.seed(1) # 乱数のシードの固定iris_tbl %>% group_by(Species) %>% slice_sample(n = 2)# # A tibble: 6 x 6# # Groups: Species [3]# id Sepal.Length Sepal.Width Petal.Length Petal.Width Species # <int> <dbl> <dbl> <dbl> <dbl> <fct> # 1 4 4.6 3.1 1.5 0.2 setosa # 2 39 4.4 3 1.3 0.2 setosa # 3 51 7 3.2 4.7 1.4 versicolor# 4 84 6 2.7 5.1 1.6 versicolor# 5 123 7.7 2.8 6.7 2 virginica # 6 143 5.8 2.7 5.1 1.9 virginica 

filter():行の条件抽出

行を条件抽出します。

R

# filter()iris_tbl %>% filter(Sepal.Length == 4.9)# # A tibble: 6 x 6# id Sepal.Length Sepal.Width Petal.Length Petal.Width Species # <int> <dbl> <dbl> <dbl> <dbl> <fct> # 1 2 4.9 3 1.4 0.2 setosa # 2 10 4.9 3.1 1.5 0.1 setosa # 3 35 4.9 3.1 1.5 0.2 setosa # 4 38 4.9 3.6 1.4 0.1 setosa # 5 58 4.9 2.4 3.3 1 versicolor# 6 107 4.9 2.5 4.5 1.7 virginica iris_tbl %>% filter(Sepal.Length == 4.9 & Species == "setosa")# # A tibble: 4 x 6# id Sepal.Length Sepal.Width Petal.Length Petal.Width Species# <int> <dbl> <dbl> <dbl> <dbl> <fct> # 1 2 4.9 3 1.4 0.2 setosa # 2 10 4.9 3.1 1.5 0.1 setosa # 3 35 4.9 3.1 1.5 0.2 setosa # 4 38 4.9 3.6 1.4 0.1 setosa iris_tbl %>% filter(Sepal.Length == 4.9 & (Species == "versicolor" | Species == "virginica"))# # A tibble: 2 x 6# id Sepal.Length Sepal.Width Petal.Length Petal.Width Species # <int> <dbl> <dbl> <dbl> <dbl> <fct> # 1 58 4.9 2.4 3.3 1 versicolor# 2 107 4.9 2.5 4.5 1.7 virginica 

NAが含まれるときは少し注意が必要です。(参考

R

# NAが入ったデータを準備iris_tbl_na <- iris_tbl %>% slice_head(n = 10) %>% mutate(Sepal.Length = na_if(Sepal.Length, 4.9)) %>% print()# # A tibble: 10 x 6# id Sepal.Length Sepal.Width Petal.Length Petal.Width Species# <int> <dbl> <dbl> <dbl> <dbl> <fct> # 1 1 5.1 3.5 1.4 0.2 setosa # 2 2 NA 3 1.4 0.2 setosa # 3 3 4.7 3.2 1.3 0.2 setosa # 4 4 4.6 3.1 1.5 0.2 setosa # 5 5 5 3.6 1.4 0.2 setosa # 6 6 5.4 3.9 1.7 0.4 setosa # 7 7 4.6 3.4 1.4 0.3 setosa # 8 8 5 3.4 1.5 0.2 setosa # 9 9 4.4 2.9 1.4 0.2 setosa # 10 10 NA 3.1 1.5 0.1 setosa iris_tbl_na %>% filter(Sepal.Length != 5.0)# # A tibble: 6 x 6# id Sepal.Length Sepal.Width Petal.Length Petal.Width Species# <int> <dbl> <dbl> <dbl> <dbl> <fct> # 1 1 5.1 3.5 1.4 0.2 setosa # 2 3 4.7 3.2 1.3 0.2 setosa # 3 4 4.6 3.1 1.5 0.2 setosa # 4 6 5.4 3.9 1.7 0.4 setosa # 5 7 4.6 3.4 1.4 0.3 setosa # 6 9 4.4 2.9 1.4 0.2 setosa # NAの行も5.0ではないが、除去されるiris_tbl_na %>% filter(Sepal.Length == 5.0 | Sepal.Length != 5.0)# # A tibble: 8 x 6# id Sepal.Length Sepal.Width Petal.Length Petal.Width Species# <int> <dbl> <dbl> <dbl> <dbl> <fct> # 1 1 5.1 3.5 1.4 0.2 setosa # 2 3 4.7 3.2 1.3 0.2 setosa # 3 4 4.6 3.1 1.5 0.2 setosa # 4 5 5 3.6 1.4 0.2 setosa # 5 6 5.4 3.9 1.7 0.4 setosa # 6 7 4.6 3.4 1.4 0.3 setosa # 7 8 5 3.4 1.5 0.2 setosa # 8 9 4.4 2.9 1.4 0.2 setosa # NAの行が除去されるため、「5.0または5.0でない」の結果が全体にならない

is.na():NAかどうか

NAかどうかを判定します。

R

iris_tbl_na %>% filter(is.na(Sepal.Length))# # A tibble: 2 x 6# id Sepal.Length Sepal.Width Petal.Length Petal.Width Species# <int> <dbl> <dbl> <dbl> <dbl> <fct> # 1 2 NA 3 1.4 0.2 setosa # 2 10 NA 3.1 1.5 0.1 setosa iris_tbl_na %>% filter(!is.na(Sepal.Length))# # A tibble: 8 x 6# id Sepal.Length Sepal.Width Petal.Length Petal.Width Species# <int> <dbl> <dbl> <dbl> <dbl> <fct> # 1 1 5.1 3.5 1.4 0.2 setosa # 2 3 4.7 3.2 1.3 0.2 setosa # 3 4 4.6 3.1 1.5 0.2 setosa # 4 5 5 3.6 1.4 0.2 setosa # 5 6 5.4 3.9 1.7 0.4 setosa # 6 7 4.6 3.4 1.4 0.3 setosa # 7 8 5 3.4 1.5 0.2 setosa # 8 9 4.4 2.9 1.4 0.2 setosa iris_tbl_na %>% drop_na(Sepal.Length)# # A tibble: 8 x 6# id Sepal.Length Sepal.Width Petal.Length Petal.Width Species# <int> <dbl> <dbl> <dbl> <dbl> <fct> # 1 1 5.1 3.5 1.4 0.2 setosa # 2 3 4.7 3.2 1.3 0.2 setosa # 3 4 4.6 3.1 1.5 0.2 setosa # 4 5 5 3.6 1.4 0.2 setosa # 5 6 5.4 3.9 1.7 0.4 setosa # 6 7 4.6 3.4 1.4 0.3 setosa # 7 8 5 3.4 1.5 0.2 setosa # 8 9 4.4 2.9 1.4 0.2 setosa 

指定した列がNAの行を削除するには、drop_na()も使えます。

%in%

R

# %in%iris_tbl %>% filter(Sepal.Length %in% c(4.3, 4.4, 4.5))# A tibble: 5 x 6# id Sepal.Length Sepal.Width Petal.Length Petal.Width Species# <int> <dbl> <dbl> <dbl> <dbl> <fct> # 1 9 4.4 2.9 1.4 0.2 setosa # 2 14 4.3 3 1.1 0.1 setosa # 3 39 4.4 3 1.3 0.2 setosa # 4 42 4.5 2.3 1.3 0.3 setosa # 5 43 4.4 3.2 1.3 0.2 setosa

between()

R

# between()iris_tbl %>% filter(between(Sepal.Length, left = 4.3, right = 4.5))# A tibble: 5 x 6# id Sepal.Length Sepal.Width Petal.Length Petal.Width Species# <int> <dbl> <dbl> <dbl> <dbl> <fct> # 1 9 4.4 2.9 1.4 0.2 setosa # 2 14 4.3 3 1.1 0.1 setosa # 3 39 4.4 3 1.3 0.2 setosa # 4 42 4.5 2.3 1.3 0.3 setosa # 5 43 4.4 3.2 1.3 0.2 setosa# これと同じiris_tbl %>% filter(4.3 <= Sepal.Length & Sepal.Length <= 4.5)

near():計算誤差込みの等号

計算誤差のために等号==がうまく使えないときがあります。そのような場合に計算誤差込みで等号を判定するために使います。

R

# near()iris_tbl %>% filter(Sepal.Length == 4.4)# # A tibble: 3 x 6# id Sepal.Length Sepal.Width Petal.Length Petal.Width Species# <int> <dbl> <dbl> <dbl> <dbl> <fct> # 1 9 4.4 2.9 1.4 0.2 setosa # 2 39 4.4 3 1.3 0.2 setosa # 3 43 4.4 3.2 1.3 0.2 setosa # Sepal.Length == 4.4 は3行あるiris_tbl %>% filter(Sepal.Length - 0.1 == 4.3)# # A tibble: 0 x 6# # ... with 6 variables: id <int>, Sepal.Length <dbl>, Sepal.Width <dbl>, Petal.Length <dbl>,# # Petal.Width <dbl>, Species <fct># Sepal.Length - 0.1 == 4.3 は1行も出てこないiris_tbl %>% filter(near(Sepal.Length - 0.1, 4.3))# # A tibble: 3 x 6# id Sepal.Length Sepal.Width Petal.Length Petal.Width Species# <int> <dbl> <dbl> <dbl> <dbl> <fct> # 1 9 4.4 2.9 1.4 0.2 setosa # 2 39 4.4 3 1.3 0.2 setosa # 3 43 4.4 3.2 1.3 0.2 setosa # near(Sepal.Length - 0.1, 4.3) とすると3行で出てくる

計算誤差のために4.4 - 4.3 == 0.1TRUEになりません。near(4.4 - 4.3, 0.1)TRUEになります。

R

4.4 - 4.3 == 0.1# [1] FALSEnear(4.4 - 4.3, 0.1)# [1] TRUEv <- c(4.3, 4.4, 4.5)v# [1] 4.3 4.4 4.5v - 4.3# [1] 0.0 0.1 0.2v - 4.3 == 0.1# [1] FALSE FALSE FALSEnear(v - 4.3, 0.1)# [1] FALSE TRUE FALSE0.1 * 2 == 0.2# [1] TRUE0.1 * 3 == 0.3# [1] FALSEnear(0.1 * 2, 0.2)# [1] TRUEnear(0.1 * 3, 0.3)# [1] TRUEv <- seq(0.1, 1.0, by = 0.1)v# [1] 0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9 1.0w <- 1:10 * 0.1w# [1] 0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9 1.0v == w# [1] TRUE TRUE TRUE TRUE TRUE FALSE TRUE TRUE TRUE TRUEnear(v, w)# [1] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE

str_detect():文字列の条件抽出

文字列の条件抽出にはstrigrの関数が併用できます。

R

# str_detect()library(stringr)iris_tbl %>% mutate(Sepal.Length = as.character(Sepal.Length)) %>% filter(str_detect(Sepal.Length, "^4.")) # "4."で始まる# # A tibble: 22 x 6# id Sepal.Length Sepal.Width Petal.Length Petal.Width Species# <int> <chr> <dbl> <dbl> <dbl> <fct> # 1 2 4.9 3 1.4 0.2 setosa # 2 3 4.7 3.2 1.3 0.2 setosa # 3 4 4.6 3.1 1.5 0.2 setosa # 4 7 4.6 3.4 1.4 0.3 setosa # 5 9 4.4 2.9 1.4 0.2 setosa # 6 10 4.9 3.1 1.5 0.1 setosa # 7 12 4.8 3.4 1.6 0.2 setosa # 8 13 4.8 3 1.4 0.1 setosa # 9 14 4.3 3 1.1 0.1 setosa # 10 23 4.6 3.6 1 0.2 setosa # # ... with 12 more rowsiris_tbl %>% mutate(Sepal.Length = as.character(Sepal.Length)) %>% filter(str_detect(Sepal.Length, ".1$")) # ".1"で終わる# # A tibble: 16 x 6# id Sepal.Length Sepal.Width Petal.Length Petal.Width Species # <int> <chr> <dbl> <dbl> <dbl> <fct> # 1 1 5.1 3.5 1.4 0.2 setosa # 2 18 5.1 3.5 1.4 0.3 setosa # 3 20 5.1 3.8 1.5 0.3 setosa # 4 22 5.1 3.7 1.5 0.4 setosa # 5 24 5.1 3.3 1.7 0.5 setosa # 6 40 5.1 3.4 1.5 0.2 setosa # 7 45 5.1 3.8 1.9 0.4 setosa # 8 47 5.1 3.8 1.6 0.2 setosa # 9 64 6.1 2.9 4.7 1.4 versicolor# 10 72 6.1 2.8 4 1.3 versicolor# 11 74 6.1 2.8 4.7 1.2 versicolor# 12 92 6.1 3 4.6 1.4 versicolor# 13 99 5.1 2.5 3 1.1 versicolor# 14 103 7.1 3 5.9 2.1 virginica # 15 128 6.1 3 4.9 1.8 virginica # 16 135 6.1 2.6 5.6 1.4 virginica iris_tbl %>% mutate(Sepal.Length = as.character(Sepal.Length)) %>% print() %>% filter(str_detect(Sepal.Length, "\\.")) # "."を含む# # A tibble: 133 x 6# id Sepal.Length Sepal.Width Petal.Length Petal.Width Species# <int> <chr> <dbl> <dbl> <dbl> <fct> # 1 1 5.1 3.5 1.4 0.2 setosa # 2 2 4.9 3 1.4 0.2 setosa # 3 3 4.7 3.2 1.3 0.2 setosa # 4 4 4.6 3.1 1.5 0.2 setosa # 5 6 5.4 3.9 1.7 0.4 setosa # 6 7 4.6 3.4 1.4 0.3 setosa # 7 9 4.4 2.9 1.4 0.2 setosa # 8 10 4.9 3.1 1.5 0.1 setosa # 9 11 5.4 3.7 1.5 0.2 setosa # 10 12 4.8 3.4 1.6 0.2 setosa # # ... with 123 more rowsiris_tbl %>% mutate(Sepal.Length = as.character(Sepal.Length)) %>% print() %>% filter(!str_detect(Sepal.Length, "\\.")) # "."を含まない# # A tibble: 17 x 6# id Sepal.Length Sepal.Width Petal.Length Petal.Width Species # <int> <chr> <dbl> <dbl> <dbl> <fct> # 1 5 5 3.6 1.4 0.2 setosa # 2 8 5 3.4 1.5 0.2 setosa # 3 26 5 3 1.6 0.2 setosa # 4 27 5 3.4 1.6 0.4 setosa # 5 36 5 3.2 1.2 0.2 setosa # 6 41 5 3.5 1.3 0.3 setosa # 7 44 5 3.5 1.6 0.6 setosa # 8 50 5 3.3 1.4 0.2 setosa # 9 51 7 3.2 4.7 1.4 versicolor# 10 61 5 2 3.5 1 versicolor# 11 63 6 2.2 4 1 versicolor# 12 79 6 2.9 4.5 1.5 versicolor# 13 84 6 2.7 5.1 1.6 versicolor# 14 86 6 3.4 4.5 1.6 versicolor# 15 94 5 2.3 3.3 1 versicolor# 16 120 6 2.2 5 1.5 virginica # 17 139 6 3 4.8 1.8 virginica 

filter(if_all()), filter(if_any()):複数列にわたる条件での行の抽出

複数列にわたって同じ条件式を適用して、それらすべてのANDやORで条件判定して行を抽出します。
条件式がx > 0であれば引数.fns~ . > 0と、f(x) > 0であれば引数.fns~ f(.) > 0と指定します。

R

iris_tbl %>% filter(if_all(ends_with("Width"), ~ . > 2.3))iris_tbl %>% filter(if_all(.cols = ends_with("Width"), .fns = ~ . > 2.3))# # A tibble: 6 x 6# id Sepal.Length Sepal.Width Petal.Length Petal.Width Species # <int> <dbl> <dbl> <dbl> <dbl> <fct> # 1 101 6.3 3.3 6 2.5 virginica# 2 110 7.2 3.6 6.1 2.5 virginica# 3 115 5.8 2.8 5.1 2.4 virginica# 4 137 6.3 3.4 5.6 2.4 virginica# 5 141 6.7 3.1 5.6 2.4 virginica# 6 145 6.7 3.3 5.7 2.5 virginica# これと同じiris_tbl %>% filter(Sepal.Width > 2.3 & Petal.Width > 2.3)iris_tbl %>% filter(if_any(ends_with("Width"), ~ . > 4))iris_tbl %>% filter(if_any(.cols = ends_with("Width"), .fns = ~ . > 4))# # A tibble: 3 x 6# id Sepal.Length Sepal.Width Petal.Length Petal.Width Species# <int> <dbl> <dbl> <dbl> <dbl> <fct> # 1 16 5.7 4.4 1.5 0.4 setosa # 2 33 5.2 4.1 1.5 0.1 setosa # 3 34 5.5 4.2 1.4 0.2 setosa # これと同じiris_tbl %>% filter(Sepal.Width > 4 | Petal.Width > 4)anscombe_tbl %>% filter(if_all(x1:x4, ~ . == 8))# # A tibble: 1 x 9# id x1 x2 x3 x4 y1 y2 y3 y4# <int> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl># 1 2 8 8 8 8 6.95 8.14 6.77 5.76# これと同じanscombe_tbl %>% filter(x1 == 8 & x2 == 8 & x3 == 8 & x4 == 8)anscombe_tbl %>% filter(if_any(x1:x4, ~ . == 8))# # A tibble: 10 x 9# id x1 x2 x3 x4 y1 y2 y3 y4# <int> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl># 1 1 10 10 10 8 8.04 9.14 7.46 6.58# 2 2 8 8 8 8 6.95 8.14 6.77 5.76# 3 3 13 13 13 8 7.58 8.74 12.7 7.71# 4 4 9 9 9 8 8.81 8.77 7.11 8.84# 5 5 11 11 11 8 8.33 9.26 7.81 8.47# 6 6 14 14 14 8 9.96 8.1 8.84 7.04# 7 7 6 6 6 8 7.24 6.13 6.08 5.25# 8 9 12 12 12 8 10.8 9.13 8.15 5.56# 9 10 7 7 7 8 4.82 7.26 6.42 7.91# 10 11 5 5 5 8 5.68 4.74 5.73 6.89# これと同じanscombe_tbl %>% filter(x1 == 8 | x2 == 8 | x3 == 8 | x4 == 8)anscombe_tbl %>% filter(if_any(y1:y4, ~ round(.) == 7))# # A tibble: 7 x 9# id x1 x2 x3 x4 y1 y2 y3 y4# <int> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl># 1 1 10 10 10 8 8.04 9.14 7.46 6.58# 2 2 8 8 8 8 6.95 8.14 6.77 5.76# 3 4 9 9 9 8 8.81 8.77 7.11 8.84# 4 6 14 14 14 8 9.96 8.1 8.84 7.04# 5 7 6 6 6 8 7.24 6.13 6.08 5.25# 6 10 7 7 7 8 4.82 7.26 6.42 7.91# 7 11 5 5 5 8 5.68 4.74 5.73 6.89# これと同じanscombe_tbl %>% filter(round(y1) == 7 | round(y2) == 7 | round(y3) == 7 | round(y4) == 7)anscombe_tbl %>% mutate(across(y1:y4, ~ round(.), .names = "round_{col}")) %>% print() %>% filter(if_any(starts_with("round_"), ~ . == 7)) %>% print() %>% select(-starts_with("round_"))# # A tibble: 11 x 13# id x1 x2 x3 x4 y1 y2 y3 y4 round_y1 round_y2 round_y3 round_y4# <int> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl># 1 1 10 10 10 8 8.04 9.14 7.46 6.58 8 9 7 7# 2 2 8 8 8 8 6.95 8.14 6.77 5.76 7 8 7 6# 3 3 13 13 13 8 7.58 8.74 12.7 7.71 8 9 13 8# 4 4 9 9 9 8 8.81 8.77 7.11 8.84 9 9 7 9# 5 5 11 11 11 8 8.33 9.26 7.81 8.47 8 9 8 8# 6 6 14 14 14 8 9.96 8.1 8.84 7.04 10 8 9 7# 7 7 6 6 6 8 7.24 6.13 6.08 5.25 7 6 6 5# 8 8 4 4 4 19 4.26 3.1 5.39 12.5 4 3 5 12# 9 9 12 12 12 8 10.8 9.13 8.15 5.56 11 9 8 6# 10 10 7 7 7 8 4.82 7.26 6.42 7.91 5 7 6 8# 11 11 5 5 5 8 5.68 4.74 5.73 6.89 6 5 6 7# # A tibble: 7 x 13# id x1 x2 x3 x4 y1 y2 y3 y4 round_y1 round_y2 round_y3 round_y4# <int> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl># 1 1 10 10 10 8 8.04 9.14 7.46 6.58 8 9 7 7# 2 2 8 8 8 8 6.95 8.14 6.77 5.76 7 8 7 6# 3 4 9 9 9 8 8.81 8.77 7.11 8.84 9 9 7 9# 4 6 14 14 14 8 9.96 8.1 8.84 7.04 10 8 9 7# 5 7 6 6 6 8 7.24 6.13 6.08 5.25 7 6 6 5# 6 10 7 7 7 8 4.82 7.26 6.42 7.91 5 7 6 8# 7 11 5 5 5 8 5.68 4.74 5.73 6.89 6 5 6 7# # A tibble: 7 x 9# id x1 x2 x3 x4 y1 y2 y3 y4# <int> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl># 1 1 10 10 10 8 8.04 9.14 7.46 6.58# 2 2 8 8 8 8 6.95 8.14 6.77 5.76# 3 4 9 9 9 8 8.81 8.77 7.11 8.84# 4 6 14 14 14 8 9.96 8.1 8.84 7.04# 5 7 6 6 6 8 7.24 6.13 6.08 5.25# 6 10 7 7 7 8 4.82 7.26 6.42 7.91# 7 11 5 5 5 8 5.68 4.74 5.73 6.89

注意)mutate(across())については、こちら参照。

where()

R

anscombe_tbl %>% filter(if_all(where(is.double), ~ . > 7))# # A tibble: 4 x 9# id x1 x2 x3 x4 y1 y2 y3 y4# <int> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl># 1 3 13 13 13 8 7.58 8.74 12.7 7.71# 2 4 9 9 9 8 8.81 8.77 7.11 8.84# 3 5 11 11 11 8 8.33 9.26 7.81 8.47# 4 6 14 14 14 8 9.96 8.1 8.84 7.04# これと同じanscombe_tbl %>% filter(if_all(x1:y4, ~ . > 7))anscombe_tbl %>% filter(x1 > 7 & x2 > 7 & x3 > 7 & x4 > 7 & y1 > 7 & y2 > 7 & y3 > 7 & y4 > 7)anscombe_tbl %>% filter(if_any(where(is.numeric), ~ round(.) == 6))# # A tibble: 6 x 9# id x1 x2 x3 x4 y1 y2 y3 y4# <int> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl># 1 2 8 8 8 8 6.95 8.14 6.77 5.76# 2 6 14 14 14 8 9.96 8.1 8.84 7.04# 3 7 6 6 6 8 7.24 6.13 6.08 5.25# 4 9 12 12 12 8 10.8 9.13 8.15 5.56# 5 10 7 7 7 8 4.82 7.26 6.42 7.91# 6 11 5 5 5 8 5.68 4.74 5.73 6.89# これと同じanscombe_tbl %>% filter(if_any(id:y4, ~ round(.) == 6))anscombe_tbl %>% filter(round(id) == 6 | round(x1) == 6 | round(x2) == 6 | round(x3) == 6 | round(x4) == 6 | round(y1) == 6 | round(y2) == 6 | round(y3) == 6 | round(y4) == 6 )anscombe_tbl %>% mutate(across(where(is.numeric), ~ round(.), .names = "round_{col}")) %>% print() %>% filter(if_any(starts_with("round_"), ~ . == 6)) %>% print() %>% select(-starts_with("round_"))# # A tibble: 11 x 18# id x1 x2 x3 x4 y1 y2 y3 y4 round_id round_x1 round_x2 round_x3 round_x4 round_y1 round_y2 round_y3# <int> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl># 1 1 10 10 10 8 8.04 9.14 7.46 6.58 1 10 10 10 8 8 9 7# 2 2 8 8 8 8 6.95 8.14 6.77 5.76 2 8 8 8 8 7 8 7# 3 3 13 13 13 8 7.58 8.74 12.7 7.71 3 13 13 13 8 8 9 13# 4 4 9 9 9 8 8.81 8.77 7.11 8.84 4 9 9 9 8 9 9 7# 5 5 11 11 11 8 8.33 9.26 7.81 8.47 5 11 11 11 8 8 9 8# 6 6 14 14 14 8 9.96 8.1 8.84 7.04 6 14 14 14 8 10 8 9# 7 7 6 6 6 8 7.24 6.13 6.08 5.25 7 6 6 6 8 7 6 6# 8 8 4 4 4 19 4.26 3.1 5.39 12.5 8 4 4 4 19 4 3 5# 9 9 12 12 12 8 10.8 9.13 8.15 5.56 9 12 12 12 8 11 9 8# 10 10 7 7 7 8 4.82 7.26 6.42 7.91 10 7 7 7 8 5 7 6# 11 11 5 5 5 8 5.68 4.74 5.73 6.89 11 5 5 5 8 6 5 6# # ... with 1 more variable: round_y4 <dbl># # A tibble: 6 x 18# id x1 x2 x3 x4 y1 y2 y3 y4 round_id round_x1 round_x2 round_x3 round_x4 round_y1 round_y2 round_y3# <int> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl># 1 2 8 8 8 8 6.95 8.14 6.77 5.76 2 8 8 8 8 7 8 7# 2 6 14 14 14 8 9.96 8.1 8.84 7.04 6 14 14 14 8 10 8 9# 3 7 6 6 6 8 7.24 6.13 6.08 5.25 7 6 6 6 8 7 6 6# 4 9 12 12 12 8 10.8 9.13 8.15 5.56 9 12 12 12 8 11 9 8# 5 10 7 7 7 8 4.82 7.26 6.42 7.91 10 7 7 7 8 5 7 6# 6 11 5 5 5 8 5.68 4.74 5.73 6.89 11 5 5 5 8 6 5 6# # ... with 1 more variable: round_y4 <dbl># # A tibble: 6 x 9# id x1 x2 x3 x4 y1 y2 y3 y4# <int> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl># 1 2 8 8 8 8 6.95 8.14 6.77 5.76# 2 6 14 14 14 8 9.96 8.1 8.84 7.04# 3 7 6 6 6 8 7.24 6.13 6.08 5.25# 4 9 12 12 12 8 10.8 9.13 8.15 5.56# 5 10 7 7 7 8 4.82 7.26 6.42 7.91# 6 11 5 5 5 8 5.68 4.74 5.73 6.89

注意)mutate(across())については、こちら参照。

arrange():行の並び替え

行を昇順に並び替えます。desc()を使うと降順にできます。

R

# arrange()iris_tbl %>% arrange(Sepal.Length) # 昇順# # A tibble: 150 x 6# id Sepal.Length Sepal.Width Petal.Length Petal.Width Species# <int> <dbl> <dbl> <dbl> <dbl> <fct> # 1 14 4.3 3 1.1 0.1 setosa # 2 9 4.4 2.9 1.4 0.2 setosa # 3 39 4.4 3 1.3 0.2 setosa # 4 43 4.4 3.2 1.3 0.2 setosa # 5 42 4.5 2.3 1.3 0.3 setosa # 6 4 4.6 3.1 1.5 0.2 setosa # 7 7 4.6 3.4 1.4 0.3 setosa # 8 23 4.6 3.6 1 0.2 setosa # 9 48 4.6 3.2 1.4 0.2 setosa # 10 3 4.7 3.2 1.3 0.2 setosa # # ... with 140 more rowsiris_tbl %>% arrange(desc(id)) # 降順# # A tibble: 150 x 6# id Sepal.Length Sepal.Width Petal.Length Petal.Width Species # <int> <dbl> <dbl> <dbl> <dbl> <fct> # 1 150 5.9 3 5.1 1.8 virginica# 2 149 6.2 3.4 5.4 2.3 virginica# 3 148 6.5 3 5.2 2 virginica# 4 147 6.3 2.5 5 1.9 virginica# 5 146 6.7 3 5.2 2.3 virginica# 6 145 6.7 3.3 5.7 2.5 virginica# 7 144 6.8 3.2 5.9 2.3 virginica# 8 143 5.8 2.7 5.1 1.9 virginica# 9 142 6.9 3.1 5.1 2.3 virginica# 10 141 6.7 3.1 5.6 2.4 virginica# # ... with 140 more rowsiris_tbl %>% arrange(Sepal.Length, desc(Sepal.Width))# # A tibble: 150 x 6# id Sepal.Length Sepal.Width Petal.Length Petal.Width Species# <int> <dbl> <dbl> <dbl> <dbl> <fct> # 1 14 4.3 3 1.1 0.1 setosa # 2 43 4.4 3.2 1.3 0.2 setosa # 3 39 4.4 3 1.3 0.2 setosa # 4 9 4.4 2.9 1.4 0.2 setosa # 5 42 4.5 2.3 1.3 0.3 setosa # 6 23 4.6 3.6 1 0.2 setosa # 7 7 4.6 3.4 1.4 0.3 setosa # 8 48 4.6 3.2 1.4 0.2 setosa # 9 4 4.6 3.1 1.5 0.2 setosa # 10 3 4.7 3.2 1.3 0.2 setosa # # ... with 140 more rowsiris_tbl %>% group_by(Species) %>% arrange(Sepal.Length, desc(Sepal.Width)) %>% slice_head(n = 5)# # A tibble: 15 x 6# # Groups: Species [3]# id Sepal.Length Sepal.Width Petal.Length Petal.Width Species # <int> <dbl> <dbl> <dbl> <dbl> <fct> # 1 14 4.3 3 1.1 0.1 setosa # 2 43 4.4 3.2 1.3 0.2 setosa # 3 39 4.4 3 1.3 0.2 setosa # 4 9 4.4 2.9 1.4 0.2 setosa # 5 42 4.5 2.3 1.3 0.3 setosa # 6 58 4.9 2.4 3.3 1 versicolor# 7 94 5 2.3 3.3 1 versicolor# 8 61 5 2 3.5 1 versicolor# 9 99 5.1 2.5 3 1.1 versicolor# 10 60 5.2 2.7 3.9 1.4 versicolor# 11 107 4.9 2.5 4.5 1.7 virginica # 12 122 5.6 2.8 4.9 2 virginica # 13 114 5.7 2.5 5 2 virginica # 14 115 5.8 2.8 5.1 2.4 virginica # 15 102 5.8 2.7 5.1 1.9 virginica 

distinct():行の重複削除

指定した列について重複する行を除去します。引数.keep_allTRUEにすると、指定した列以外の列も残せます(つまり、指定した列に重複がある場合に最初の行のみ残して重複する行が削除されます)。

R

# distinct()iris_tbl %>% distinct(Species)# # A tibble: 3 x 1# Species # <fct> # 1 setosa # 2 versicolor# 3 virginicairis_tbl %>% distinct(Species, .keep_all = TRUE)# # A tibble: 3 x 6# id Sepal.Length Sepal.Width Petal.Length Petal.Width Species # <int> <dbl> <dbl> <dbl> <dbl> <fct> # 1 1 5.1 3.5 1.4 0.2 setosa # 2 51 7 3.2 4.7 1.4 versicolor# 3 101 6.3 3.3 6 2.5 virginica # これと同じiris_tbl %>% group_by(Species) %>% slice_head(n = 1)iris_tbl %>% distinct(Sepal.Length, Sepal.Width)# # A tibble: 117 x 2# Sepal.Length Sepal.Width# <dbl> <dbl># 1 5.1 3.5# 2 4.9 3 # 3 4.7 3.2# 4 4.6 3.1# 5 5 3.6# 6 5.4 3.9# 7 4.6 3.4# 8 5 3.4# 9 4.4 2.9# 10 4.9 3.1# # ... with 107 more rows# これと同じiris_tbl %>% select(Sepal.Length, Sepal.Width) %>% unique()iris_tbl %>% arrange(Species, desc(Sepal.Length)) %>% distinct(Species, .keep_all = TRUE)# # A tibble: 3 x 6# id Sepal.Length Sepal.Width Petal.Length Petal.Width Species # <int> <dbl> <dbl> <dbl> <dbl> <fct> # 1 15 5.8 4 1.2 0.2 setosa # 2 51 7 3.2 4.7 1.4 versicolor# 3 132 7.9 3.8 6.4 2 virginica # これと同じiris_tbl %>% group_by(Species) %>% slice_max(Sepal.Length, n = 1)

group_by():グループ化

グループ別にスライスしたり、グループ別に並び替えたり、グループ別に集計したりする場合に使います。
グループ化しただけでは特に何もなりません。

R

# group_by()iris_tbl %>% group_by(Species)# # A tibble: 150 x 6# # Groups: Species [3]# id Sepal.Length Sepal.Width Petal.Length Petal.Width Species# <int> <dbl> <dbl> <dbl> <dbl> <fct> # 1 1 5.1 3.5 1.4 0.2 setosa # 2 2 4.9 3 1.4 0.2 setosa # 3 3 4.7 3.2 1.3 0.2 setosa # 4 4 4.6 3.1 1.5 0.2 setosa # 5 5 5 3.6 1.4 0.2 setosa # 6 6 5.4 3.9 1.7 0.4 setosa # 7 7 4.6 3.4 1.4 0.3 setosa # 8 8 5 3.4 1.5 0.2 setosa # 9 9 4.4 2.9 1.4 0.2 setosa # 10 10 4.9 3.1 1.5 0.1 setosa # # ... with 140 more rows

ungroup():グループ化の解除

グループ化を解除します。

R

# ungroup()iris_tbl %>% group_by(Species) %>% ungroup()# # A tibble: 150 x 6# id Sepal.Length Sepal.Width Petal.Length Petal.Width Species# <int> <dbl> <dbl> <dbl> <dbl> <fct> # 1 1 5.1 3.5 1.4 0.2 setosa # 2 2 4.9 3 1.4 0.2 setosa # 3 3 4.7 3.2 1.3 0.2 setosa # 4 4 4.6 3.1 1.5 0.2 setosa # 5 5 5 3.6 1.4 0.2 setosa # 6 6 5.4 3.9 1.7 0.4 setosa # 7 7 4.6 3.4 1.4 0.3 setosa # 8 8 5 3.4 1.5 0.2 setosa # 9 9 4.4 2.9 1.4 0.2 setosa # 10 10 4.9 3.1 1.5 0.1 setosa # # ... with 140 more rows

drop_na():NAの行の削除

指定した列がNAの行を削除します。

R

# NAを含むデータを準備iris_tbl_na <- iris_tbl %>% slice_head(n = 10) %>% mutate(Sepal.Length = na_if(Sepal.Length, 4.9), Sepal.Width = na_if(Sepal.Width, 3.4)) %>% print()# # A tibble: 10 x 6# id Sepal.Length Sepal.Width Petal.Length Petal.Width Species# <int> <dbl> <dbl> <dbl> <dbl> <fct> # 1 1 5.1 3.5 1.4 0.2 setosa # 2 2 NA 3 1.4 0.2 setosa # 3 3 4.7 3.2 1.3 0.2 setosa # 4 4 4.6 3.1 1.5 0.2 setosa # 5 5 5 3.6 1.4 0.2 setosa # 6 6 5.4 3.9 1.7 0.4 setosa # 7 7 4.6 NA 1.4 0.3 setosa # 8 8 5 NA 1.5 0.2 setosa # 9 9 4.4 2.9 1.4 0.2 setosa # 10 10 NA 3.1 1.5 0.1 setosa # drop_na()iris_tbl_na %>% drop_na(Sepal.Length)# # A tibble: 8 x 6# id Sepal.Length Sepal.Width Petal.Length Petal.Width Species# <int> <dbl> <dbl> <dbl> <dbl> <fct> # 1 1 5.1 3.5 1.4 0.2 setosa # 2 3 4.7 3.2 1.3 0.2 setosa # 3 4 4.6 3.1 1.5 0.2 setosa # 4 5 5 3.6 1.4 0.2 setosa # 5 6 5.4 3.9 1.7 0.4 setosa # 6 7 4.6 NA 1.4 0.3 setosa # 7 8 5 NA 1.5 0.2 setosa # 8 9 4.4 2.9 1.4 0.2 setosa iris_tbl_na %>% filter(!is.na(Sepal.Length))iris_tbl_na %>% drop_na(Sepal.Length, Sepal.Width)# # A tibble: 6 x 6# id Sepal.Length Sepal.Width Petal.Length Petal.Width Species# <int> <dbl> <dbl> <dbl> <dbl> <fct> # 1 1 5.1 3.5 1.4 0.2 setosa # 2 3 4.7 3.2 1.3 0.2 setosa # 3 4 4.6 3.1 1.5 0.2 setosa # 4 5 5 3.6 1.4 0.2 setosa # 5 6 5.4 3.9 1.7 0.4 setosa # 6 9 4.4 2.9 1.4 0.2 setosa iris_tbl_na %>% filter(!is.na(Sepal.Length) & !is.na(Sepal.Width))

complete(), expand():列の値のすべての組み合わせからなる行の作成

指定した列の値のすべての組み合わせからなる行を作成します。
complete()は、指定した列の値のすべての組み合わせが登場するように、指定しなかった列にNA(または指定した値)を補完した行を挿入します(補完する値はfillにリストで指定します)。
expand()は、指定した列の値のすべての組み合わせからなるデータフレームを返します(指定しなかった列はなくなります)。

R

# complete()iris_tbl %>% slice_head(n = 3) %>% print() %>% complete(id, Sepal.Length)# # A tibble: 3 x 6# id Sepal.Length Sepal.Width Petal.Length Petal.Width Species# <int> <dbl> <dbl> <dbl> <dbl> <fct> # 1 1 5.1 3.5 1.4 0.2 setosa # 2 2 4.9 3 1.4 0.2 setosa # 3 3 4.7 3.2 1.3 0.2 setosa # # A tibble: 9 x 6# id Sepal.Length Sepal.Width Petal.Length Petal.Width Species# <int> <dbl> <dbl> <dbl> <dbl> <fct> # 1 1 4.7 NA NA NA NA # 2 1 4.9 NA NA NA NA # 3 1 5.1 3.5 1.4 0.2 setosa # 4 2 4.7 NA NA NA NA # 5 2 4.9 3 1.4 0.2 setosa # 6 2 5.1 NA NA NA NA # 7 3 4.7 3.2 1.3 0.2 setosa # 8 3 4.9 NA NA NA NA # 9 3 5.1 NA NA NA NA iris_tbl %>% slice_head(n = 3) %>% print() %>% complete(id, Sepal.Length, fill = list(Sepal.Width = 0.0, Species = "setosa"))# # A tibble: 3 x 6# id Sepal.Length Sepal.Width Petal.Length Petal.Width Species# <int> <dbl> <dbl> <dbl> <dbl> <fct> # 1 1 5.1 3.5 1.4 0.2 setosa # 2 2 4.9 3 1.4 0.2 setosa # 3 3 4.7 3.2 1.3 0.2 setosa # A tibble: 9 x 6# id Sepal.Length Sepal.Width Petal.Length Petal.Width Species# <int> <dbl> <dbl> <dbl> <dbl> <fct> # 1 1 4.7 0 NA NA setosa # 2 1 4.9 0 NA NA setosa # 3 1 5.1 3.5 1.4 0.2 setosa # 4 2 4.7 0 NA NA setosa # 5 2 4.9 3 1.4 0.2 setosa # 6 2 5.1 0 NA NA setosa # 7 3 4.7 3.2 1.3 0.2 setosa # 8 3 4.9 0 NA NA setosa # 9 3 5.1 0 NA NA setosa # expand()iris_tbl %>% slice_head(n = 3) %>% print() %>% expand(id, Sepal.Length)# # A tibble: 3 x 6# id Sepal.Length Sepal.Width Petal.Length Petal.Width Species# <int> <dbl> <dbl> <dbl> <dbl> <fct> # 1 1 5.1 3.5 1.4 0.2 setosa # 2 2 4.9 3 1.4 0.2 setosa # 3 3 4.7 3.2 1.3 0.2 setosa # # A tibble: 9 x 2# id Sepal.Length# <int> <dbl># 1 1 4.7# 2 1 4.9# 3 1 5.1# 4 2 4.7# 5 2 4.9# 6 2 5.1# 7 3 4.7# 8 3 4.9# 9 3 5.1iris_tbl %>% expand(Species)# # A tibble: 3 x 1# Species # <fct> # 1 setosa # 2 versicolor# 3 virginica iris_tbl %>% distinct(Species)

rowid_to_column(), rownames_to_column():行番号・行名を列名に

R

# rowid_to_column()iris_tbl %>% rowid_to_column("rowid")# # A tibble: 150 x 7# rowid id Sepal.Length Sepal.Width Petal.Length Petal.Width Species# <int> <int> <dbl> <dbl> <dbl> <dbl> <fct> # 1 1 1 5.1 3.5 1.4 0.2 setosa # 2 2 2 4.9 3 1.4 0.2 setosa # 3 3 3 4.7 3.2 1.3 0.2 setosa # 4 4 4 4.6 3.1 1.5 0.2 setosa # 5 5 5 5 3.6 1.4 0.2 setosa # 6 6 6 5.4 3.9 1.7 0.4 setosa # 7 7 7 4.6 3.4 1.4 0.3 setosa # 8 8 8 5 3.4 1.5 0.2 setosa # 9 9 9 4.4 2.9 1.4 0.2 setosa # 10 10 10 4.9 3.1 1.5 0.1 setosa # # ... with 140 more rows# rownames_to_column()iris_tbl %>% rownames_to_column("rowname")# # A tibble: 150 x 7# rowname id Sepal.Length Sepal.Width Petal.Length Petal.Width Species# <chr> <int> <dbl> <dbl> <dbl> <dbl> <fct> # 1 1 1 5.1 3.5 1.4 0.2 setosa # 2 2 2 4.9 3 1.4 0.2 setosa # 3 3 3 4.7 3.2 1.3 0.2 setosa # 4 4 4 4.6 3.1 1.5 0.2 setosa # 5 5 5 5 3.6 1.4 0.2 setosa # 6 6 6 5.4 3.9 1.7 0.4 setosa # 7 7 7 4.6 3.4 1.4 0.3 setosa # 8 8 8 5 3.4 1.5 0.2 setosa # 9 9 9 4.4 2.9 1.4 0.2 setosa # 10 10 10 4.9 3.1 1.5 0.1 setosa # # ... with 140 more rows

column_to_rownames():列名を行名に

R

# column_to_rownames()anscombe_tbl %>% mutate(rowname = LETTERS[1:11]) %>% print() %>% column_to_rownames("rowname")# # A tibble: 11 x 10# id x1 x2 x3 x4 y1 y2 y3 y4 rowname# <int> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <chr> # 1 1 10 10 10 8 8.04 9.14 7.46 6.58 A # 2 2 8 8 8 8 6.95 8.14 6.77 5.76 B # 3 3 13 13 13 8 7.58 8.74 12.7 7.71 C # 4 4 9 9 9 8 8.81 8.77 7.11 8.84 D # 5 5 11 11 11 8 8.33 9.26 7.81 8.47 E # 6 6 14 14 14 8 9.96 8.1 8.84 7.04 F # 7 7 6 6 6 8 7.24 6.13 6.08 5.25 G # 8 8 4 4 4 19 4.26 3.1 5.39 12.5 H # 9 9 12 12 12 8 10.8 9.13 8.15 5.56 I # 10 10 7 7 7 8 4.82 7.26 6.42 7.91 J # 11 11 5 5 5 8 5.68 4.74 5.73 6.89 K # id x1 x2 x3 x4 y1 y2 y3 y4# A 1 10 10 10 8 8.04 9.14 7.46 6.58# B 2 8 8 8 8 6.95 8.14 6.77 5.76# C 3 13 13 13 8 7.58 8.74 12.74 7.71# D 4 9 9 9 8 8.81 8.77 7.11 8.84# E 5 11 11 11 8 8.33 9.26 7.81 8.47# F 6 14 14 14 8 9.96 8.10 8.84 7.04# G 7 6 6 6 8 7.24 6.13 6.08 5.25# H 8 4 4 4 19 4.26 3.10 5.39 12.50# I 9 12 12 12 8 10.84 9.13 8.15 5.56# J 10 7 7 7 8 4.82 7.26 6.42 7.91# K 11 5 5 5 8 5.68 4.74 5.73 6.89
Rのデータフレームの行操作についてのメモ - Qiita (2024)

FAQs

Rでデータフレームを作成するにはどうすればいいですか? ›

データフレームを作成するには、 data.frame() 関数を使用します。 この関数は、1 つまたは複数のベクトルまたはリストを引数として受け取り、各ベクトルまたはリストがデータフレームの列に対応します。 また、 read. csv() 関数を使用して CSV ファイルからデータフレームを作成することもできます。

Rでグループ化を解除するには? ›

グループ化を解除したいときは ungroup(グループ化されたデータフレーム) と実行します。 覚えておきましょう。

Tibbleには行名はありますか? ›

tibble は行名をサポートしていない。 これらは、 tibble への変換時や部分集合時に除去される。

Dplyrで列名を変更するにはどうすればいいですか? ›

dplyr で列名を変更するには、 rename() 関数を使用します。 新しい列名と古い列名を = で結びます。 列名の指定に、 "" は不要です。

Rでデータフレームとは何ですか? ›

縦方向に観測値を、横方向に変数を並べたデータのことをRではデータフレームと呼びます。

Rでデータフレームの列名を取得するにはどうすればいいですか? ›

列名は names() 関数か colnames() 関数で、項目名は rownames() 関数で取得できる。 列名や項目名は、それぞれの参照関数にベクトルを代入することで変更できる。

行をグループ化するにはどうすればいいですか? ›

Shift+Alt+→”で行と列をグループ化!

列や行をグループ化したいときは“Shift+Alt+→(右)”!

Tibbleで表示できる行数はいくつですか? ›

tibble を表示すると、1画面に収まる最初の10行とすべての列のみが表示されます。

Tibbleの特徴は? ›

以下、tibble特徴をあげる。
  • データフレームのソースと大きさ、変数のデータ型を表示する
  • 出力の際にデータフレーム全体を表示するのではなく、データフレームの一部を返す
  • 入力された値(文字列)をそのまま評価する ...
  • 列名の空白や記号を入力の通りに評価する

Rのオブジェクトにはどんな種類がありますか? ›

Rオブジェクトには、主に次の4つのデータの型があります。
  • character(文字列型)
  • numeric(実数型)
  • integer(整数型)
  • logical(論理値型)
Dec 22, 2021

Rの変数名にはどのようなルールがありますか? ›

R 変数名 (識別子)
  1. 変数名は、数字またはアンダースコア(_)で始めることはできません。
  2. 変数名は大文字と小文字が区別されます (age、Age、AGE は3つの異なる変数です)。
  3. 予約語は変数として使用できません(TRUE、FALSE、NULL、if...)。

Rで特定の列を除外するにはどうすればいいですか? ›

select() 関数では、抽出する列を選択できますが、特定の列を除外するということもできます。 使い方は、 select(-列名) と、列名にマイナスを付けるだけです

Rで変数名を一括で変更するにはどうすればいいですか? ›

変数名一括変更する流れは以下の3ステップです。
  1. データセットの列をリストに格納する
  2. くっつけたい文字列と変数名リストを結合する
  3. 結合した変数名リストに列を更新する
May 14, 2022

Rでデータを保存するにはどうすればいいですか? ›

保存のためのショートカットキーでおなじみの「Ctrl + S」(Windows)や「Command + S」(Mac)でも保存が可能です。 入力カーソルがソースコードにある状態でショートカットキーを押せば、新規保存または上書き保存となります。

RとRStudioの違いは何ですか? ›

「R」「RStudio」とは

「R」は統計やデータ解析に特化したプログラミング言語です。 「RStudio」は「R」を使いやすくするためのアプリです。 「RStudio」のアプリを使って「R」を操作するため、「R」も「RStudio」もそれぞれインストールする必要があります。

R Studioでデータを保存するにはどうすればいいですか? ›

保存の方法は、いくつかあります。
  1. メニューから File > Save、または File > Save As… を選択する。 ...
  2. ソースエディタの上またはRStudioのウィンドウ上の をクリックする。 ...
  3. メニューから File > Save All、または RStudioのウィンドウ上の をクリックする。
Jul 31, 2017

統計ソフトのRは何ができますか? ›

さまざまな統計ができる

Rは統計に強いプログラミングなこともあり、Rだとほとんどの統計ができます。 それはよく使うt検定や相関係数といったものだけでなく、多変量解析やさらに高度な統計(一般化線形混合モデルなど)、ベイズなど様々な統計が可能です。

Top Articles
Latest Posts
Article information

Author: Corie Satterfield

Last Updated:

Views: 5993

Rating: 4.1 / 5 (62 voted)

Reviews: 93% of readers found this page helpful

Author information

Name: Corie Satterfield

Birthday: 1992-08-19

Address: 850 Benjamin Bridge, Dickinsonchester, CO 68572-0542

Phone: +26813599986666

Job: Sales Manager

Hobby: Table tennis, Soapmaking, Flower arranging, amateur radio, Rock climbing, scrapbook, Horseback riding

Introduction: My name is Corie Satterfield, I am a fancy, perfect, spotless, quaint, fantastic, funny, lucky person who loves writing and wants to share my knowledge and understanding with you.