dplyr::select
df <- dplyr::select(iris, c(Sepal.Width,Species))
head(df, 3)
## Sepal.Width Species
## 1 3.5 setosa
## 2 3.0 setosa
## 3 3.2 setosa
- dplyr::select(データフレーム, 列の指定, …)
- 列の指定方法は、基本subsetと同様
- 列の指定については、さらに特別な関数が利用可能
列選択用関数: starts_with()
df <- dplyr::select(iris, starts_with("sepal"))
head(df, 3)
## Sepal.Length Sepal.Width
## 1 5.1 3.5
## 2 4.9 3.0
## 3 4.7 3.2
- start_with(x, ignore.case = TRUE)
- 前方一致で変数を検索してもってくる
- なお
ignore.case = FALSE
にすると、大文字と小文字を区別してくれる
列選択用関数: ends_with()
df <- dplyr::select(iris, ends_with("width"))
head(df, 3)
## Sepal.Width Petal.Width
## 1 3.5 0.2
## 2 3.0 0.2
## 3 3.2 0.2
- ends_with(x, ignore.case = TRUE)
- 後方一致で変数を検索して持ってくる
列選択用関数: contains()
df <- dplyr::select(iris, contains("pe"))
head(df, 3)
## Petal.Length Petal.Width Species
## 1 1.4 0.2 setosa
## 2 1.4 0.2 setosa
## 3 1.3 0.2 setosa
- contains(x, ignore.case = TRUE)
- 部分一致で変数を検索して持ってくる
列選択用関数: matches()
df <- dplyr::select(iris, matches(".t."))
head(df, 3)
## Sepal.Length Sepal.Width Petal.Length Petal.Width
## 1 5.1 3.5 1.4 0.2
## 2 4.9 3.0 1.4 0.2
## 3 4.7 3.2 1.3 0.2
- matches(x, ignore.case = TRUE)
- 正規表現で指定してマッチする変数を持ってくる
列選択用関数: num_range()
df <- as.data.frame(matrix(1:30, nrow = 3, ncol = 10))
colnames(df) <- c(paste0("beer", 1:5), paste0("sake0", 1:5))
ls(df)
## [1] "beer1" "beer2" "beer3" "beer4" "beer5" "sake01" "sake02"
## [8] "sake03" "sake04" "sake05"
dplyr::select(df, num_range("beer", 1:3, 1))
## beer1 beer2 beer3
## 1 1 4 7
## 2 2 5 8
## 3 3 6 9
dplyr::select(df, num_range("sake", 2:4, 2))
## sake02 sake03 sake04
## 1 19 22 25
## 2 20 23 26
## 3 21 24 27
- num_range(“文字列”, 対象の数値, 桁数)
- “beer1からbeer3まで”といった指定方法。桁数があるのがGood!
列選択用関数: one_of()
vname <- c("Petal.Length", "Sepal.Width")
df <- dplyr::select(iris, one_of(vname))
head(df, 3)
## Petal.Length Sepal.Width
## 1 1.4 3.5
## 2 1.4 3.0
## 3 1.3 3.2
- 変数名を文字列ベクトルでまとめて渡す時に使用。
- これで挟み込まずにそのままベクトルを指定してもエラーが出る
列選択用関数: everything()
df <- as.data.frame(matrix(1:15, nrow = 3, ncol = 5))
colnames(df) <- c("touyama", "hanazawa", "komatsu", "asumi", "sakura")
dplyr::select(df, everything())
## touyama hanazawa komatsu asumi sakura
## 1 1 4 7 10 13
## 2 2 5 8 11 14
## 3 3 6 9 12 15
dplyr::select(df, hanazawa, touyama, everything())
## hanazawa touyama komatsu asumi sakura
## 1 4 1 7 10 13
## 2 5 2 8 11 14
## 3 6 3 9 12 15
dplyr::mutate()
df <- dplyr::mutate(iris, beer=Sepal.Width*2)
head(df, 2)
## Sepal.Length Sepal.Width Petal.Length Petal.Width Species beer
## 1 5.1 3.5 1.4 0.2 setosa 7
## 2 4.9 3.0 1.4 0.2 setosa 6
df <- dplyr::mutate(df, beer=Sepal.Width*3)
head(df, 2)
## Sepal.Length Sepal.Width Petal.Length Petal.Width Species beer
## 1 5.1 3.5 1.4 0.2 setosa 10.5
## 2 4.9 3.0 1.4 0.2 setosa 9.0
- dplyr::mutate(データフレーム、変数名=処理内容)
- データフレームに新たに列を追加します
- 変数名に既存の変数を指定すると上書きします
dplyr::mutate_each()
df <- dplyr::mutate_each(iris, funs(. * 2), -Species)
kable(head(df,2))
10.2 |
7 |
2.8 |
0.4 |
setosa |
9.8 |
6 |
2.8 |
0.4 |
setosa |
- dplyr::mutate_each(データフレーム、関数, …)
- 複数の列に、関数の内容を一気にあてます
- …のところで変数を指定します
dplyr::filter()
df <- dplyr::filter(iris, Species=='virginica')
head(df, 3)
## Sepal.Length Sepal.Width Petal.Length Petal.Width Species
## 1 6.3 3.3 6.0 2.5 virginica
## 2 5.8 2.7 5.1 1.9 virginica
## 3 7.1 3.0 5.9 2.1 virginica
- dplyr::filter(データフレーム, 条件式)
- 使い方はsubset()と同様
dplyr::arrange()
df <- dplyr::arrange(iris, Sepal.Length)
head(df, 3)
## Sepal.Length Sepal.Width Petal.Length Petal.Width Species
## 1 4.3 3.0 1.1 0.1 setosa
## 2 4.4 2.9 1.4 0.2 setosa
## 3 4.4 3.0 1.3 0.2 setosa
df <- dplyr::arrange(df, desc(Sepal.Length))
head(df, 3)
## Sepal.Length Sepal.Width Petal.Length Petal.Width Species
## 1 7.9 3.8 6.4 2.0 virginica
## 2 7.7 3.8 6.7 2.2 virginica
## 3 7.7 2.6 6.9 2.3 virginica
- dplyr::arrange(データフレーム, キー列)で昇順
- dplyr::arrange(データフレーム, desc(キー列))で降順
データセットの準備
a <- data.frame(x1=c("A","B","C"),x2=1:3)
b <- data.frame(x1=c("A","B","D"),x3=c(TRUE, FALSE, TRUE))
y <- data.frame(x1=c("A","B","C"),x2=1:3)
z <- data.frame(x1=c("B","C","D"),x2=2:4)
- aとbを結合する場合、共通する変数はx1
x1をキーにして、mergeします
- yとzを結合する場合、変数は共通です 行を追加してまとめる、あるいは列を追加してまとめます
dplyr::full_join()
df <- dplyr::full_join(a,b,by="x1")
## Warning in outer_join_impl(x, y, by$x, by$y): joining factors with
## different levels, coercing to character vector
kable(df)
A |
1 |
TRUE |
B |
2 |
FALSE |
C |
3 |
NA |
D |
NA |
TRUE |
- dplyr::full_join(データフレーム1, データフレーム2, by=キー変数)
- 全ての行と列を結合します
- 該当するものがない場合、
NA
がはいります
dplyr::inner_join()
df <- dplyr::inner_join(a,b,by="x1")
## Warning in inner_join_impl(x, y, by$x, by$y): joining factors with
## different levels, coercing to character vector
kable(df)
- dplyr::full_join(データフレーム1, データフレーム2, by=キー変数)
- 両方のデータフレームに存在する行のみを残して結合します
dplyr::bind_cols()
df <- dplyr::bind_cols(y, z)
kable(df)
- 左のデータフレームに右のデータフレームの列を追加します
- 行数が一致してないとエラーになります
dplyr::bind_rows()
df <- dplyr::bind_rows(y, z)
## Warning in rbind_all(x, .id): Unequal factor levels: coercing to character
kable(df)
- 左のデータフレームに右のデータフレームの行を追加します
- 列数が一致してないとエラーになります
dplyr::bind_row(…, .id=)
df <- dplyr::bind_rows(y, z, .id = "df_id")
## Warning in rbind_all(x, .id): Unequal factor levels: coercing to character
kable(df)
1 |
A |
1 |
1 |
B |
2 |
1 |
C |
3 |
2 |
B |
2 |
2 |
C |
3 |
2 |
D |
4 |
- 引数として
.id=**
を指定すると、テーブルidを変数として作成してくれます
- これ、めっちゃ便利です
tidyr::gather()
df <- tidyr::gather(data=iris, key = keykey, value = valuevalue, -Species)
kable(head(df, 4))
setosa |
Sepal.Length |
5.1 |
setosa |
Sepal.Length |
4.9 |
setosa |
Sepal.Length |
4.7 |
setosa |
Sepal.Length |
4.6 |
- data: 使用するデータフレーム
- key: まとめた時に、「この行の値はどの変数に入ってたものか」を示す変数。
- value: まとめた変数の値。
- …: まとめる変数を指定します。dplyr::select()のテクニックがそのまま使えます
tidyr::spread()
# irisにID列を追加して、gatherでまとめている
df <- dplyr::mutate(iris, id=rownames(iris)) %>%
tidyr::gather(key = keykey, value = valuevalue, contains("l."))
knitr::kable(head(df,2))
setosa |
1 |
Sepal.Length |
5.1 |
setosa |
2 |
Sepal.Length |
4.9 |
# ひっつけたけどspreadでバラします
df_2 <- tidyr::spread(df, key = keykey, value = valuevalue)
knitr::kable(head(df_2,2))
setosa |
1 |
5.1 |
3.5 |
1.4 |
0.2 |
setosa |
10 |
4.9 |
3.1 |
1.5 |
0.1 |
- gatherと逆の動きをします
- ただし、spreadを実行した後に、主キーとなるような変数が存在する必要があります
- データベース的なものがあるんだと思います