いろいろ倉庫

KNIME、EXCEL、R、Pythonなどの備忘録

【R】data.frameの基本的な使い方をメモしておきたい

・お題:すぐに使い方を忘れるので、データフレームの基本的な使い方をメモしておきたい。

 

・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

 

 

おわり