・お題:すぐに使い方を忘れるので、データフレームの基本的な使い方をメモしておきたい。
・tidyverseを読み込む。
> library(tidyverse)
・適当にデータフレームを作成する。
> df <- data.frame(ID = c("A-01","A-02","B-01","B-02","C-01","C-02"),
+ Score1 = c(1,3,5,2,4,6),
+ Score2 = c(3,1,4,1,5,9)
> df
ID Score1 Score2
1 A-01 1 3
2 A-02 3 1
3 B-01 5 4
4 B-02 2 1
5 C-01 4 5
6 C-02 6 9
・ちなみに、空データフレームを作成する場合。
> data.frame(matrix(ncol = 3, nrow = 3))
X1 X2 X3
1 NA NA NA
2 NA NA NA
3 NA NA NA
・行名と列名を確認したり、変更する。
> rownames(df)
[1] "1" "2" "3" "4" "5" "6"
> colnames(df)
[1] "ID" "Score1" "Score2"
> dim(df)
[1] 6 3
> rownames(df) <- df$ID
> df
ID Score1 Score2
A-01 A-01 1 3
A-02 A-02 3 1
B-01 B-01 5 4
B-02 B-02 2 1
C-01 C-01 4 5
C-02 C-02 6 9
・並び替える。
#Score1で昇順
> arrange(df, Score1)
ID Score1 Score2
A-01 A-01 1 3
B-02 B-02 2 1
A-02 A-02 3 1
C-01 C-01 4 5
B-01 B-01 5 4
C-02 C-02 6 9
#Score1で降順
> arrange(df, -Score1)
ID Score1 Score2
C-02 C-02 6 9
B-01 B-01 5 4
C-01 C-01 4 5
A-02 A-02 3 1
B-02 B-02 2 1
A-01 A-01 1 3
・文字列の置換
#ID列のハイフンをアンダーバーに置換
> df$ID <- str_replace(df$ID, "-", "_")
> df
ID Score1 Score2
A-01 A_01 1 3
A-02 A_02 3 1
B-01 B_01 5 4
B-02 B_02 2 1
C-01 C_01 4 5
C-02 C_02 6 9
・列区切り
#ID列のアンダーバーでセルをカチ割って、GroupとNumberという列名を付ける
> df <- separate(df, ID, c("Group", "Number"), sep="_")
> df
Group Number Score1 Score2
A-01 A 01 1 3
A-02 A 02 3 1
B-01 B 01 5 4
B-02 B 02 2 1
C-01 C 01 4 5
C-02 C 02 6 9
・ちなみに、uniteでくっつけれる。
> unite(df, col = "Kuttsuke", c(Group, Number), sep = "_")
Kuttsuke Score1 Score2
A-01 A_01 1 3
A-02 A_02 3 1
B-01 B_01 5 4
B-02 B_02 2 1
C-01 C_01 4 5
C-02 C_02 6 9
・Score1とScore2に関して、縦持ちに変換
> pivot_longer(df, cols = c("Score1", "Score2"),
+ names_to = "Scores",
+ values_to = "Value")
# A tibble: 12 x 4
Group Number Scores Value
<chr> <chr> <chr> <dbl>
1 A 01 Score1 1
2 A 01 Score2 3
3 A 02 Score1 3
4 A 02 Score2 1
5 B 01 Score1 5
6 B 01 Score2 4
7 B 02 Score1 2
8 B 02 Score2 1
9 C 01 Score1 4
10 C 01 Score2 5
11 C 02 Score1 6
12 C 02 Score2 9
・行を条件で抽出。
#例えば、Score1が3.5未満
> df$Score1 < 3.5
[1] TRUE TRUE FALSE TRUE FALSE FALSE
> df[df$Score1 < 3.5, ]
Group Number Score1 Score2
A-01 A 01 1 3
A-02 A 02 3 1
B-02 B 02 2 1
・合否判定の列を作成。
#Score1が3.5未満でBAD、3.5以上でGOODにラベル付けする列を追加。
> df$Judge1 <- ifelse(df$Score1 < 3.5, "BAD", "GOOD")
> df
Group Number Score1 Score2 Judge1
A-01 A 01 1 3 BAD
A-02 A 02 3 1 BAD
B-01 B 01 5 4 GOOD
B-02 B 02 2 1 BAD
C-01 C 01 4 5 GOOD
C-02 C 02 6 9 GOOD
・data.frameをグループ化
> df <- group_by(df, Group)
> df
# A tibble: 6 x 5
# Groups: Group [3]
Group Number Score1 Score2 Judge1
<chr> <chr> <dbl> <dbl> <chr>
1 A 01 1 3 BAD
2 A 02 3 1 BAD
3 B 01 5 4 GOOD
4 B 02 2 1 BAD
5 C 01 4 5 GOOD
6 C 02 6 9 GOOD
・グループで集計
> summarize(df, Heikin1 = mean(Score1), Saidai2 = max(Score2))
# A tibble: 3 x 3
Group Heikin1 Saidai2
<chr> <dbl> <dbl>
1 A 2 3
2 B 3.5 4
3 C 5 9
・ちなみに、グループ解除はungroup。
> df <- ungroup(df)
> df <- group_by(df, Number)
> summarize(df, Heikin1 = mean(Score1), Saidai2 = max(Score2))
# A tibble: 2 x 3
Number Heikin1 Saidai2
<chr> <dbl> <dbl>
1 01 3.33 5
2 02 3.67 9
おわり