いろいろ倉庫

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

【R】Rの使い方メモ②(データフレーム)

・お題:Rの基本的な使い方に関して、長くなったので分けて記載することにした。今回はデータフレーム関連。思いついたら随時追加していきたい。

 

・とりあえず、csvを読み込む。

> df<-read.csv("test.csv")
> df
   ID      Name Nenshu Shusshin
1   a    Tanaka    300    Tokyo
2   b      Sato    400    Tokyo
3   c    Suzuki    500 Hokkaido
4   d     Saito    600 Hokkaido
5   e    Yamada    700 Hokkaido
6   f  Yamamoto    700 Hokkaido
7   g Yamaguchi    600  Okinawa
8   h   Taguchi    500  Okinawa
9   I   Iwamoto    300    Tokyo
10  j    Takada    500    Tokyo
11  k      Ueda    600  Okinawa

・データフレームやオブジェクトの構造を確認したい場合、attributes関数が便利。

> attributes(df)
$names
[1] "ID"       "Name"     "Nenshu"   "Shusshin"

$class
[1] "data.frame"

$row.names
 [1]  1  2  3  4  5  6  7  8  9 10 11

 

・データフレームの変数を確認したい場合、str関数やtable関数を使う。table関数では、クロス集計っぽいこともできる。

> str(df)
'data.frame':    11 obs. of  4 variables:
 $ ID      : chr  "a" "b" "c" "d" ...
 $ Name    : chr  "Tanaka" "Sato" "Suzuki" "Saito" ...
 $ Nenshu  : int  300 400 500 600 700 700 600 500 300 500 ...
 $ Shusshin: chr  "Tokyo" "Tokyo" "Hokkaido" "Hokkaido" ...

 

> table(df$Nenshu)

300 400 500 600 700 
  2   1   3   3   2 

 

> table(df$Nenshu,df$Shusshin)
     
      Hokkaido Okinawa Tokyo
  300        0       0     2
  400        0       0     1
  500        1       1     1
  600        1       2     0
  700        2       0     0

・割合を調べたければ、prop.table関数を使う。

> prop.table(table(df$Nenshu,df$Shusshin))

        Hokkaido    Okinawa      Tokyo
  300 0.00000000 0.00000000 0.18181818
  400 0.00000000 0.00000000 0.09090909
  500 0.09090909 0.09090909 0.09090909
  600 0.09090909 0.18181818 0.00000000
  700 0.18181818 0.00000000 0.00000000

・何かの変数に含まれるUniqueな値を調べたければ、Unique関数を使う。

> unique(df$Shusshin)
[1] "Tokyo"    "Hokkaido" "Okinawa" 

 

・データフレームに変数を追加したい場合は、df$変数名<-で代入できる。

> df$Shincho<-c(123,134,145,156,167,178,190,132,143,154,165)
> df
   ID      Name Nenshu Shusshin Shincho
1   a    Tanaka    300    Tokyo     123
2   b      Sato    400    Tokyo     134
3   c    Suzuki    500 Hokkaido     145
4   d     Saito    600 Hokkaido     156
5   e    Yamada    700 Hokkaido     167
6   f  Yamamoto    700 Hokkaido     178
7   g Yamaguchi    600  Okinawa     190
8   h   Taguchi    500  Okinawa     132
9   I   Iwamoto    300    Tokyo     143
10  j    Takada    500    Tokyo     154
11  k      Ueda    600  Okinawa     165

 

・条件でデータを抜き出したい場合、以下のようにTURE/FALSEで抜き出せる。

> df$Nenshu>500
 [1] FALSE FALSE FALSE  TRUE  TRUE  TRUE  TRUE FALSE FALSE
[10] FALSE  TRUE

> df[df$Nenshu>500,]
   ID      Name Nenshu Shusshin Shincho
4   d     Saito    600 Hokkaido     156
5   e    Yamada    700 Hokkaido     167
6   f  Yamamoto    700 Hokkaido     178
7   g Yamaguchi    600  Okinawa     190
11  k      Ueda    600  Okinawa     165

 

・Bool型は!でひっくり返すことができるので、特定の条件に合わないものを抽出することもできる。これを使って、特定の列を削除すると以下のような感じ。"Shincho"列が消えた。

> df<-df[!colnames(df)=="Shincho"]
> df
   ID      Name Nenshu Shusshin
1   a    Tanaka    300    Tokyo
2   b      Sato    400    Tokyo
3   c    Suzuki    500 Hokkaido
4   d     Saito    600 Hokkaido
5   e    Yamada    700 Hokkaido
6   f  Yamamoto    700 Hokkaido
7   g Yamaguchi    600  Okinawa
8   h   Taguchi    500  Okinawa
9   I   Iwamoto    300    Tokyo
10  j    Takada    500    Tokyo
11  k      Ueda    600  Okinawa

 

・どれかの列を基準に表を並び替えたいときは、order関数で行番号の順位をつけてデータをぬきだすような処理をする。例えば年収で昇順に並べると以下のような感じ。降順に並べたければ、引数decreasingにTRUEを与えればいけるっぽい。

> df[order(df$Nenshu),]
   ID      Name Nenshu Shusshin
1   a    Tanaka    300    Tokyo
9   I   Iwamoto    300    Tokyo
2   b      Sato    400    Tokyo
3   c    Suzuki    500 Hokkaido
8   h   Taguchi    500  Okinawa
10  j    Takada    500    Tokyo
4   d     Saito    600 Hokkaido
7   g Yamaguchi    600  Okinawa
11  k      Ueda    600  Okinawa
5   e    Yamada    700 Hokkaido
6   f  Yamamoto    700 Hokkaido

 

おわり。