初心者用 R 言語講座演習ノート


初心者用 - R_Stats2.pdf

4. 簡単なベクトル演算

 (x <- c(2,4,6,8,10))    # ベクトルの作成
 length(x)               # ベクトルの次元数、すなわちベクトル中の数値の個数
 x[3]                    # 3 番目の数値を抽出する
 x[c(2,4)]               # 2番目と 4 番目の数値を抽出
 x[2:4]                  # 2 番目から 4 番目までの数値を抽出

[1]  2  4  6  8 10
[1] 5
[1] 6
[1] 4 8
[1] 4 6 8

ベクトルの比較演算

x
x > 5                    # ベクトルの各要素が 5 より大きいかの判定
which (x>5)
x[which(x>5)]
x[x>5]
[1]  2  4  6  8 10
[1] FALSE FALSE  TRUE  TRUE  TRUE
[1] 3 4 5
[1]  6  8 10
[1]  6  8 10
  • 判定した結果が TRUE, FALSE のベクトルとして返ってきます。
  • which を使うと、何番目が T なのかが返ってきます。

文字列のベクトル

x <- c("Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday")

x[c(2,4)]
x[2:4]
grep("sd", x)  # "sd"を含む要素を探す

[1] "Monday"    "Wednesday"
[1] "Monday"    "Tuesday"   "Wednesday"
[1] 3 4 5

ベクトルの各要素の名前付け

x <- c(2, 4, 6)
names(x) <- c("First", "Second", "Third")
x[["Second"]]

x の names という 属性 に (“First”, “Second”, “Third”) が 付けられる。

数値ベクトルに対する様々な統計関数


sum(x)     # x の合計、
mean(x)    # x の平均
(x <- c(2,4,6,8,10));
sum(x > 5) # x の中のTRUEの数を数える
[1] 30
[1] 6
[1]  2  4  6  8 10
[1] 3

課題 4-1:

ベクトル(3, 1, 4, 1, 5, 9, 2, 6, 5)の中で 5 より大きい要素からなるベクトルを作成 しましょう。


課題 4-2:

ベクトル(1,2,3,4,5,6,7,8,9,10,11,12)に(“Jan”, “Feb”, “Mar”, “Apr”, “May”, “Jun”, “Jul”, “Aug”, “Sep”, “Oct”, “Nov”, “Dec”)という名前を付け、”Mar”という文字列を使って 3 番目の要素を取り出してみましょう。

5. 簡単な行列の作成と演算

ベクトルを集めて行列を作成する

(x <- rbind(c(1,2,3), c(4,5,6)))
(x <- matrix(c(1, 4, 2, 5, 3, 6), nrow=2, ncol=3)) # nrow:行数, ncol:列数

     [,1] [,2] [,3]
[1,]    1    2    3
[2,]    4    5    6
     [,1] [,2] [,3]
[1,]    1    2    3
[2,]    4    5    6
x+1
x*2

y <- rbind(c(2, 4, 6), c(8, 10, 12))

x + y 
x * y

x[2,3]
x[2,]
x[,3]
t(x) # 転置

	 [,1] [,2] [,3]
    [1,]    2    3    4
    [2,]    5    6    7
	 [,1] [,2] [,3]
    [1,]    2    4    6
    [2,]    8   10   12
	 [,1] [,2] [,3]
    [1,]    3    6    9
    [2,]   12   15   18
	 [,1] [,2] [,3]
    [1,]    2    8   18
    [2,]   32   50   72
    [1] 6
    [1] 4 5 6
    [1] 3 6
	 [,1] [,2]
    [1,]    1    4
    [2,]    2    5
    [3,]    3    6
apply(x, 2, mean) # 行和,xの2次元目の各項の平均
apply(x, 1, mean) # 列和,xの1次元目の各項の平均

[1] 2.5 3.5 4.5
[1] 2 5

行列は 2 次元の数値の羅列ですが、 R では array(ベクトル、各次元の要素の個数)を使っ てさらに n 次元に拡張された配列を扱うことができます。

(x <- array(1:24, c(3,4,2))) # 3×4×2 の大きさの3次元配列を作成


    , , 1

	 [,1] [,2] [,3] [,4]
    [1,]    1    4    7   10
    [2,]    2    5    8   11
    [3,]    3    6    9   12

    , , 2

	 [,1] [,2] [,3] [,4]
    [1,]   13   16   19   22
    [2,]   14   17   20   23
    [3,]   15   18   21   24

課題5-1:

課題5-2: 上記結果に対して行、列それぞれの平均を求めましょう。

6. 簡単なリストの作成

リストは様々な型のデータをひとまとめにして管理できるデータ型です。

(x <- list("Oh", "Nomura", "Kadota"))
(x <- list("Oh", "Nomura", "Kadota", c(868, 657, 567)))

x[[2]]
x[[4]]

    [[1]]
    [1] "Oh"

    [[2]]
    [1] "Nomura"

    [[3]]
    [1] "Kadota"
    [[1]]
    [1] "Oh"

    [[2]]
    [1] "Nomura"

    [[3]]
    [1] "Kadota"

    [[4]]
    [1] 868 657 567
    [1] "Nomura"
    [1] 868 657 567

各々の要素に名前を付けることも可能です。

(x <- list(First="Oh", Second="Nomura", Third="Kadota", Home_Runs=c(868, 657, 567)))

    $First
    [1] "Oh"

    $Second
    [1] "Nomura"

    $Third
    [1] "Kadota"

    $Home_Runs
    [1] 868 657 567

として、各々の要素に First, Second, Third, Home_Runs という名前が 付いていることを確認しましょう。

x[[4]]
x$Home_Runs


[1] 868 657 567
[1] 868 657 567

課題 6-1: 名前が Yamagata のベクトル(“Tsuruoka”, “Sakata”, “Yonezawa”)と名前が Niigata のベクトル(“Yuzawa”, “Niitsu”, “Shibata”)を要素にしたようなリストを作成し、そ の中味を表示し てみましょう。8

7. 簡単なデータフレームの作成

R にはデータフレームと呼ばれる型が存在します。

  • リストの一種で、行列と同じ二次元配列です。

データフレームの各々の行は1つのサンプルに対する観測値、 各列はサン プルに対する1つの項目とみなすことができます。 これを使うと、表を簡単に表現するこ とができます。 以下の表は日本プロ野球の5人の元選手の名前、在籍チーム名、通算打数、 安打数、本塁打数を表したものです。

Home_Runs 2901 657 3085 504 2543 504 2786 868 2566 567

(x <- data.frame(
 row.names = c("Nomura", "Harimoto", "Kinugasa", "Oh", "Kadota"),
 Team = c("Hawks", "Flyers", "Carps", "Giants", "Hawks"),
 At_Bat = c(10472, 9666, 9404, 9250, 8868),
 Hits = c(2901, 3085, 2543, 2786, 2566),
 Home_Runs = c(657, 504, 504, 868, 567)
))

           Team At_Bat Hits Home_Runs
Nomura    Hawks  10472 2901       657
Harimoto Flyers   9666 3085       504
Kinugasa  Carps   9404 2543       504
Oh       Giants   9250 2786       868
Kadota    Hawks   8868 2566       567
x$Hits
x[ c(1,5), c(2,3,4) ] # 1、5 行目と 2、3、4 列目を抽出する
[1] 2901 3085 2543 2786 2566
       At_Bat Hits Home_Runs
Nomura  10472 2901       657
Kadota   8868 2566       567
attributes(x)

$names
[1] "Team"      "At_Bat"    "Hits"      "Home_Runs"

$class
[1] "data.frame"

$row.names
[1] "Nomura"   "Harimoto" "Kinugasa" "Oh"       "Kadota"
names(x)
row.names(x)
class(x)

[1] "Team"      "At_Bat"    "Hits"      "Home_Runs"
[1] "Nomura"   "Harimoto" "Kinugasa" "Oh"       "Kadota"
[1] "data.frame"

課題 7-1:

下の表は G8 加盟国の国力の一部です。これをデータフレームとして変数にしま しょう5。

(x <- data.frame(
row.names = c("USA", "England", "Italy", "Canada", "Germany", "Japan", "France", "Russia"), 
    Area = c(9.4, 0.2, 0.3, 10.0, 0.3, 0.3, 0.5, 17.1),
    Population = c(315, 62, 60, 34, 82, 127, 62, 141),
    GDP = c(14, 3, 2, 2, 4, 5, 3, 2)
))
        Area Population GDP
USA      9.4        315  14
England  0.2         62   3
Italy    0.3         60   2
Canada  10.0         34   2
Germany  0.3         82   4
Japan    0.3        127   5
France   0.5         62   3
Russia  17.1        141   2

課題 7-2:

上記で作成したデータフレームより G8 加盟国の国土面積、人口、GDP の 平均を それぞれ求めましょう。

x
mean(x$Area)
mean(x[["Population"]])
mean(x[,3])
c("mean(x$Area) = ", mean(x$Area))

	    Area Population GDP
    USA      9.4        315  14
    England  0.2         62   3
    Italy    0.3         60   2
    Canada  10.0         34   2
    Germany  0.3         82   4
    Japan    0.3        127   5
    France   0.5         62   3
    Russia  17.1        141   2
    [1] 4.7625
    [1] 110.375
    [1] 4.375
    [1] "mean(x$Area) = " "4.7625"

Author: suzuki@iwate-u.ac.jp 鈴木正幸,非常勤講師

Created: 2021-11-11 木 07:35

Validate