トップ 差分 一覧 ソース 検索 ヘルプ PDF RSS ログイン

R.data

*disclaimer
55033

R

R.data


 サンプルデータ

  • Rをインストールした時点で、サンプルデータもインストールされている。
    • data() で一覧表示される。
Data sets in package ‘datasets’:

AirPassengers                      Monthly Airline Passenger Numbers 1949-1960
BJsales                            Sales Data with Leading Indicator
BJsales.lead (BJsales)             Sales Data with Leading Indicator
BOD                                Biochemical Oxygen Demand
CO2                                Carbon Dioxide Uptake in Grass Plants
ChickWeight                        Weight versus age of chicks on different diets
DNase                              Elisa assay of DNase
EuStockMarkets                     Daily Closing Prices of Major European Stock Indices, 1991-1998
Formaldehyde                       Determination of Formaldehyde
HairEyeColor                       Hair and Eye Color of Statistics Students
Harman23.cor                       Harman Example 2.3

  • 身長と体重と性別のサンプルデータ

https://helloacm.com/the-machine-learning-case-study-how-to-predict-weight-over-heightgender-using-linear-regression/

  • どんなデータか、その概要を知る
    • str() でデータの概要が表示される
> str(kimatsu)
'data.frame':   18 obs. of  2 variables:
 $ kokugo : num  83 45 73 50 22 67 77 89 66 90 ...
 $ suugaku: num  90 55 90 43 33 55 48 98 56 75 ...

  • グラフにして様子を見る

ランダムサンプリング sample(数値の範囲, サンプル数)

sample(1:100, 50)
 [1] 68 39  1 34 87 43 14 82 59 51 85 21 54 74  7 73 79 37 83 97 44 84 33 35 70 96 42 38 20 28 72 80 40 69 25 99 91 75
[39]  6 24 32 94  2 45 18 22 92 90 98 64
  • これで、ランダムな数字を必要なだけ出しておいて、
  • それを「要素番号」として指定することで、
  • データフレーム中のデータをランダムに選び出せる。
> iris[random50,]
    Sepal.Length Sepal.Width Petal.Length Petal.Width    Species
70           5.6         2.5          3.9         1.1 versicolor
87           6.7         3.1          4.7         1.5 versicolor
100          5.7         2.8          4.1         1.3 versicolor
75           6.4         2.9          4.3         1.3 versicolor
81           5.5         2.4          3.8         1.1 versicolor
13           4.8         3.0          1.4         0.1     setosa
40           5.1         3.4          1.5         0.2     setosa
89           5.6         3.0          4.1         1.3 versicolor
  • ランダムに選んだ残りは -をつけて指定すればよい
> iris[-random50,]
    Sepal.Length Sepal.Width Petal.Length Petal.Width    Species
2            4.9         3.0          1.4         0.2     setosa
3            4.7         3.2          1.3         0.2     setosa
4            4.6         3.1          1.5         0.2     setosa
5            5.0         3.6          1.4         0.2     setosa
6            5.4         3.9          1.7         0.4     setosa
7            4.6         3.4          1.4         0.3     setosa
8            5.0         3.4          1.5         0.2     setosa
9            4.4         2.9          1.4         0.2     setosa
11           5.4         3.7          1.5         0.2     setosa
14           4.3         3.0          1.1         0.1     setosa

rnorm(個数, 平均, 標準偏差)

  • ダミーのデータを作り出す。(何か試してみたいときに)
  • 平均と標準偏差を省略して個数だけ指定した場合、平均0、標準偏差1の正規分布データからのランダム抽出
> rnorm(10)
 [1]  1.4364014 -0.5077639  0.3058840  0.1259501 -1.1296745  0.3292148
 [7]  0.9260699 -0.6915141 -1.8044824 -1.1223909
> rnorm(10)
 [1]  2.49496685  0.59830372  0.32473479  0.74853727 -1.52421661  0.98082241
 [7]  0.91520576  1.19348810  0.27119494 -0.08119991
> rnorm(10)
 [1]  0.28923196  0.59616551 -0.20413144 -0.03034469 -0.19886301  0.33546843
 [7] -0.31893659 -0.28439913 -0.58158149 -0.68247953
> rnorm(10)
    • 平均50で、標準偏差10のデータを40人分
      • やってみてヒストグラム作るとわかりますが、40人程度では、ランダムだと、「え、これが」と思われるような分布になります。400でもまだまだ、4000になるとまあまあ、40000だとかなり安定した正規分布になりますね。
      • 同じグラフでも、boxplotだと、40でもきれいにつりあいの取れたグラフになります。
> rnorm(40, 50, 10)
 [1] 54.92133 52.74849 53.63346 54.34087 63.92496 48.14784 53.24380 51.89087 46.62319
[10] 33.08571 37.38375 69.22399 57.46107 59.48568 44.48870 52.82696 35.83338 62.21806
[19] 52.94664 39.54044 49.31500 45.00038 60.97926 51.26191 41.98686 29.47495 41.15922
[28] 55.83927 70.17838 63.72457 43.71194 52.10943 45.59285 59.61884 41.72390 47.07231
[37] 50.06059 54.59948 48.93411 48.99457
> hist((rnorm(40, 50, 10)))

 Rで扱うデータの種類

  • 図でわかりやすい ↓

https://cell-innovation.nig.ac.jp/surfers/vector_difference.html

ベクトル

  • プログラミングで言う「配列」
  • 「変数名」をつける
  • 要素が入っている
  • 変数名 <- c(要素をカンマで区切って並べる)
    • 例:国語と数学の得点
    • kokugo <- c(83, 45, 73, 50, 22)
    • suugaku <- c(90, 55, 90, 43, 33)
  • 要素は前から順番に位置が決まっている
  • 変数名をタイプすると内容が表示される
> kokugo
[1] 83 45 73 50 22

データフレーム

  • プログラミングで言う「多次元配列」
  • 行が項目
  • 列が測定値
  • 複数のベクトルを合わせてデータフレームを作ることもできる
  • 変数名 <- data.frame(ベクトル名をカンマで区切って並べる)
    • 例:期末試験の得点(国語と数学)
    • kimatsu <- data.frame(kokugo, suugaku)
  • 変数名をタイプすると内容が表示される
>kimatsu

  kokugo suugaku
1     83      90
2     45      55
3     73      90
4     50      43
5     22      33

  • 個々のベクトルを指定するときは $ を使う
    • 国語の得点 kimatsu$kokugo
    • 数学の得点 kimatsu$suugaku

  • 逆に、あるデータフレームの特定の列を取り出して、別のデータフレームにする
icnaleMLS.MLT <- data.frame(icnale$MLS, icnale$MLT)

  • 何行何列あるか調べる dim()
> dim(fragE11)
[1] 19282    10

19282行・10列あることがわかる。

  • カラム名を確認 names()
> names(ToothGrowth)
[1] "len"  "supp" "dose"

  • データフレームかどうか、確認is.data.frame()

  • データフレーム内の複数の列で並べ替え
data[order(data$pid, data$week),]
  • pidのカラムで並べ替えてから、weekのカラムで並べ替える
    • 事前
  pid week score
1   1    8     3
2   1    6     3
3   1    3     2
4   1    2     1
5   1    7     3
6   1    4     3
    • 事後
    pid week score
8     1    1     1
4     1    2     1
3     1    3     2
6     1    4     3
7     1    5     3
2     1    6     3

 データの型の変換

> as.tibble(sample2)
# A tibble: 100 x 8
      ID unnatural personal demonst connective cohesion coherence reader
   <int>     <int>    <int>   <int>      <int>    <int>     <int>  <int>
 1  1001         2        1       1          1        1         1      1
 2  1002         3        2       2          1        2         3      1
 3  1003         1        1       1          1        1         2      1
 4  1004         2        2       2          1        2         1      1
 5  1005         3        2       2          2        2         1      1
 6  1006         3        4       2          3        3         2      2

> sample2$unnatural <- as.factor(sample2$unnatural)

> as.tibble(sample2)
# A tibble: 100 x 8
      ID unnatural personal demonst connective cohesion coherence reader
   <int> <fct>        <int>   <int>      <int>    <int>     <int>  <int>
 1  1001 2                1       1          1        1         1      1
 2  1002 3                2       2          1        2         3      1
 3  1003 1                1       1          1        1         2      1
 4  1004 2                2       2          1        2         1      1
 5  1005 3                2       2          2        2         1      1
 6  1006 3                4       2          3        3         2      2

  • すべての列を変換
data.new <-lapply(data.org, as.factor)

 データの型の確認

  • dim()
  • class()
> class(sample)
[1] "data.frame"
> class(sample$unnatural)
[1] "integer"
> class(sample2$unnatural)
[1] "factor"
  • mode()
  • typeof()

> dim(cn2S4)
[1] 103   2

> class(cn2S4)
[1] "data.frame"

> mode(cn2S4)
[1] "list"

> typeof(cn2S4)
[1] "list"

> typeof(cn2S4$MDD)
[1] "integer"

> class(cn2S4$MDD)
[1] "factor"

> mode(cn2S4$MDD)
[1] "numeric"


  • summary()
  • str()

間違いやすい点のまとめ

https://cell-innovation.nig.ac.jp/surfers/R_point.html

 事前にデータを作っておく

  • 表計算ソフトなどで、テキストファイル(タブ区切りやCSV)で保存しておく。
  • 一件一行
  • 一番上の行は、変数名
  • 欠損値は NA と記入しておく
  • ファイルの読み込み
    • データフレーム名 <- read.table(choose.files())
    • これでウインドウが開くのでどのファイルを読み込むか指定する

エクセルから「コピペ」することもできる

  1. エクセル上でデータを一覧にしておく
    1. 一番上の行は見出しとして行名を入れておく。これがRでも使われるので、簡潔な記号にしておくのがよい。
  2. 取り入れたいデータ部分をマウスでドラッグして選び、Ctrl+Cとかでコピーする。
  3. ウィンドウをRに切り替えて、
  4. Rのコンソールで以下の命令を打って、実行(エンターキーを押す)。
データフレーム名 <- read.delim("clipboard")
もしくは、
データフレーム名 <- read.table("clipboard", header=T)
  • データフレーム名は、Rの中でのデータの名前
  • 見出しの有り無しのデフォルトが、read.delimとread.tableで違うので注意
  • 見出しの一部を変更するには、要素番号で見出しを指定して上書きする。
> names(KSL)[3] <- "SL"
    • KSLというデータの3番目の見出しをSLに変更する例

テキストファイル読み込み


    • 一文一行ずつ読み込んで全体はベクトル。一文一行が一要素。
x <- readLines(choose.files())

x <- scan(choose.files(), what="char", sep="\n")

要素の比較 %in%

x %in% y

欠損値を計算から外すオプション

na.rm=T

 データの一部(サブセット)を取り出す:条件に当てはまるものだけを選ぶ subset()



subset(データフレーム名, 条件)

  • or 条件は |
  • and条件は &
  • 文字のマッチは =="文字"


文長が4以上: SL >= 4
文長が4以上14以下: SL >=4 & SL <= 14

該当するデータの特定の列だけを出力


subset(データフレーム名, 条件, 出力列)

  • 出力列の例
select = c(MHD, MDD)

KSL.sub <- subset(KSL, SL >=4 & SL <= 14, select = c(SL, MHD, MDD))
    • 文長が4以上14以下に該当するデータのうち、SLとMHDとMDDのカラムだけを取り出す。

  • 単純に要素番号の指定だけでもできる
> jp2gram2 <- jp2gram[,3:4]

 データの選択

  • Reference

https://kazutan.github.io/JSSP2018_spring/data_handling.html

  • TOEICスコアがないものを除外する
> head(bginfo)
     ID TOEIC TOEFL C.test Group
1 JP001   720    NA  69.38     A
2 JP002   930    NA  67.50     A
3 JP003   525   500  56.25     A
4 JP004    NA   477  60.00     A
5 JP005   440   501  56.25     A
6 JP006   800   490  65.00     A


> filter(bginfo, !is.na(TOEIC))
      ID TOEIC TOEFL C.test Group
1  JP001   720    NA  69.38     A
2  JP002   930    NA  67.50     A
3  JP003   525   500  56.25     A
4  JP005   440   501  56.25     A
5  JP006   800   490  65.00     A
6  JP012   740    NA  30.00     A

条件を複数重ねる

> filter(bginfo, !is.na(TOEIC), !is.na(TOEFL))
      ID TOEIC TOEFL C.test Group
1  JP003   525   500  56.25     A
2  JP005   440   501  56.25     A
3  JP006   800   490  65.00     A
4  JP015   750   510  58.13     A
5  JP016   685   487  61.88     B
6  JP017   605   500  52.50     B
7  JP018   570   507  43.13     B
8  JP021   875   530  54.38     B
9  JP022   880   460  68.13     B
10 JP024   620   540  58.75     B
11 JP025   875   520  70.00     B
  • これで、TOEICもTOEFLも両方スコアのあるデータだけになった。

 データの一部(特定のカラム)を取り出す

data.frame()

  • いくつものカラムが並ぶデータの特定のカラムだけを使いたい場合
    • 連続していれば、データフレーム[,2:4] とすれば、2列目から4列目だけを取り出せる
    • 非連続している場合は、data.frame()で、カラム名を指定して取り出す
data.frame(x$ID, x$age, x$score)

 データフレーム内のカテゴリー変数のレベル名の並び替え

  • デフォルトだとアルファベット順になる。
> str(onomato.data)
'data.frame':	120 obs. of  4 variables:
 $ subj  : int  1 2 3 4 5 6 7 8 9 10 ...
 $ cond  : Factor w/ 2 levels "cont","exp": 2 2 2 2 2 2 2 2 2 2 ...
 $ timing: Factor w/ 3 levels "delay","post",..: 3 3 3 3 3 3 3 3 3 3 ...
 $ score : int  65 75 35 70 85 55 85 20 50 55 ...
> levels(onomato.data$timing)
[1] "delay" "post"  "pre"  
  • 特定の順番に並べ替える
> onomato.data2 <- transform(onomato.data, timing=factor(timing, levels=c("pre", "post", "delay")))
> levels(onomato.data2$timing)
[1] "pre"   "post"  "delay"

 データの一部を削除する

  • 削除する行・列番号にマイナスをつけて別途保存する。

 データに行番号をつける。(ランクの順位を数値として入れておくなど)row()

行番号を rankというカラムに追加する

top10000.df$rank <- row(top10000.df)
head(top10000.df)

    top10000 rank
the    68659    1
of     38144    2
to     28852    3
and    28657    4
in     22834    5
a      19779    6

行のnames属性を独立したカラムとして追加する rownames()

> top10000.df$item <- rownames(top10000.df)
> head(top10000.df)
    top10000 rank item
the    68659    1  the
of     38144    2   of
to     28852    3   to
and    28657    4  and
in     22834    5   in
a      19779    6    a
  • これで、該当の項目を grep で検索できる
> grep("therefore", top10000.df$item)
[1] 175
  • thereforeは175位

 ファイルへの書き出し


write(変数, "ファイル名", ncol=列数)

  • データフレームは、write.table()で書き出す。
write.table(データフレーム名, "ファイル名")

write.csv(データフレーム名, "ファイル名.csv")

  • csvファイルをエクセルで読み込む場合
      • エクセルは、デフォルトは日本語文字コードはS-JIS
      • ファイルにBOMという情報が付いていないとS-JISと思って読み込む。ファイルがUTF-8だと文字化ける。
      • BOMをつけてcsvファイル出力するには、tidyverseパッケージの中のdplyrライブラリーを使って write_excel_csv()命令で保存する。
install.packages("tidyverse")
library(dplyr)
wirte_excel_csv(データ名, "output.csv")

 データの操作

変数を縦につなげる

rbind(変数1, 変数2)

変数を横につなげる

cbind()

 データを縦横に一連の同じ処理をする apply()

行単位で処理(二つ目の引数 1):たとえば、平均点を出す

apply(x, 1, 関数)

> head(tesuto)
  koku  suu eigo
1 46.2 40.4 50.3
2 36.0 54.7 64.7
3 46.6 61.7 48.7
4 43.2 52.6 51.8
5 49.6 42.0 43.2
6 43.1 53.5 60.4
> tesuto$total <- apply(tesuto[1:3], 1, sum)
> head(tesuto)
  koku  suu eigo total
1 46.2 40.4 50.3 136.9
2 36.0 54.7 64.7 155.4
3 46.6 61.7 48.7 157.0
4 43.2 52.6 51.8 147.6
5 49.6 42.0 43.2 134.8
6 43.1 53.5 60.4 157.0

列単位で処理(二つ目の引数 2):たとえば、総合点を出す

apply(x, 2, 関数)

一部の列だけを集計して合計の列を付け足す rowSums()

  • 2列目から9列目を足して、totalの列を右端に付け足す
> head(fragJA)
          fragment p1c1a p5c2a p2c3a p7c4a p6c5a p3c6a p4c7a p8c8a
1      (NP (PRP ))  1070   656   840  1114  1070   758  1043   970
2            (. .)   815   863   833   814   771   795   841   777
3      (ROOT (S ))   812   858   835   810   771   794   834   770
4 (PP (IN ) (NP ))   950   950   666   703   896   799   761   588
5            (, ,)   640   679   651   642   680   697   673   644
6  (S (NP ) (VP ))   574   597   728   688   620   513   730   615

fragJA$total <- rowSums(fragJA[,2:9])

> head(fragJA)
          fragment p1c1a p5c2a p2c3a p7c4a p6c5a p3c6a p4c7a p8c8a total
1      (NP (PRP ))  1070   656   840  1114  1070   758  1043   970  7521
2            (. .)   815   863   833   814   771   795   841   777  6509
3      (ROOT (S ))   812   858   835   810   771   794   834   770  6484
4 (PP (IN ) (NP ))   950   950   666   703   896   799   761   588  6313
5            (, ,)   640   679   651   642   680   697   673   644  5306
6  (S (NP ) (VP ))   574   597   728   688   620   513   730   615  5065


 個々のオブジェクトをファイルに保存

保存

save(オブジェクト, file="ファイル名.Rdata")

オブジェクトは、複数あってもよい

save(オブジェクト, オブジェクト, オブジェクト, file="ファイル名.Rdata")

読み込み

load("ファイル名.Rdata")

読み込んだ結果、もともとのオブジェクトがもともとのオブジェクト名で復元される。


 読み込むときに別名にしたいとき

保存

saveRDS(オブジェクト, file="ファイル名.rds")

復元

readRDS(file="ファイル名.rds")

別名 <- readRDS(file="ファイル名.rds")

 data.frameから取り出したものをmatrixに変換

> head(fragJ11)
          fragment p1c1a p5c2a p2c3a p7c4a p6c5a p3c6a p4c7a p8c8a p8c1b p4c2b p3c3b p6c4b p7c5b p2c6b p5c7b p1c8b JPtotal
1      (NP (PRP ))  1070   656   840  1114  1070   758  1043   970  1063  1006   837  1218   986   814   628   999   15072
2            (. .)   815   863   833   814   771   795   841   777   879   852   839   815   790   831   821   764   13100
3      (ROOT (S ))   812   858   835   810   771   794   834   770   877   852   831   812   782   832   818   761   13049
4 (PP (IN ) (NP ))   950   950   666   703   896   799   761   588   537   671   831   806   742   717  1001   915   12533
5            (, ,)   640   679   651   642   680   697   673   644   542   582   591   608   639   627   676   662   10233
6  (S (NP ) (VP ))   574   597   728   688   620   513   730   615   625   789   551   677   667   665   551   564   10154
> x <- fragJ11[2,2:17]
> x
  p1c1a p5c2a p2c3a p7c4a p6c5a p3c6a p4c7a p8c8a p8c1b p4c2b p3c3b p6c4b p7c5b p2c6b p5c7b p1c8b
2   815   863   833   814   771   795   841   777   879   852   839   815   790   831   821   764
> class(x)
[1] "data.frame"
> y <- as.matrix(x)
> class(y)
[1] "matrix"
> y
  p1c1a p5c2a p2c3a p7c4a p6c5a p3c6a p4c7a p8c8a p8c1b p4c2b p3c3b p6c4b p7c5b p2c6b p5c7b p1c8b
2   815   863   833   814   771   795   841   777   879   852   839   815   790   831   821   764
> dimnames(y) <- NULL
> y
     [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10] [,11] [,12] [,13] [,14] [,15] [,16]
[1,]  815  863  833  814  771  795  841  777  879   852   839   815   790   831   821   764
> class(y)
[1] "matrix"


  • 二行目の2から17番目の要素だけ取り出す
x <- fragJ11[2,2:17]
  • マトリックスに変換
y <- as.matrix(x)
  • 見出しにNULLを入れて見出しをなくす
dimnames(y) <- NULL

 行列を入れ替える: t関数

> x <- matrix(1:9, nrow=3, ncol=3)
> x
     [,1] [,2] [,3]
[1,]    1    4    7
[2,]    2    5    8
[3,]    3    6    9
> t(x)
     [,1] [,2] [,3]
[1,]    1    2    3
[2,]    4    5    6
[3,]    7    8    9

 Box Plot Diagram to Identify Outliers

boxplotと外れ値の説明 ↓ わかりやすい
https://www.whatissixsigma.net/box-plot-diagram-to-identify-outliers/