R has a wide variety of data types including scalars, vectors (numerical, character, logical), matrices, data frames, and lists.

1 Vector

x <- c(-1.1 , -0.5 , 1 , 2.2 , 3 , 5 , 6.6 , 10) # numeric
x
## [1] -1.1 -0.5  1.0  2.2  3.0  5.0  6.6 10.0
y <- c("大竹" , "Otake" , "オオタケ" , "おおたけ") # character
y
## [1] "大竹"     "Otake"    "オオタケ" "おおたけ"
z <- c("TRUE" , "TRUE" , "FALSE" , "TRUE" , "FALSE") # logical
z
## [1] "TRUE"  "TRUE"  "FALSE" "TRUE"  "FALSE"
# Vectorの特定の要素を参照
x[c(1,4)] # xの1,4番目を参照
## [1] -1.1  2.2
x[x <= 1] # xの1以下を参照
## [1] -1.1 -0.5  1.0
s <- seq(1:8) # 連番
s
## [1] 1 2 3 4 5 6 7 8

1.1 Vectorの演算

x;s
## [1] -1.1 -0.5  1.0  2.2  3.0  5.0  6.6 10.0
## [1] 1 2 3 4 5 6 7 8
x + s # Vectorの和,x+s
## [1] -0.1  1.5  4.0  6.2  8.0 11.0 13.6 18.0
x - s # Vectorの差,x-s
## [1] -2.1 -2.5 -2.0 -1.8 -2.0 -1.0 -0.4  2.0
x * s # Vectorの積,x*s
## [1] -1.1 -1.0  3.0  8.8 15.0 30.0 46.2 80.0
x / s # Vectorの商,x/s
## [1] -1.1000000 -0.2500000  0.3333333  0.5500000  0.6000000  0.8333333  0.9428571
## [8]  1.2500000

2 Matrix

# matrix(data = NA, nrow = 1, ncol = 1, byrow = FALSE, dimnames = NULL) 
d <- c(201,183,
       231,285)
rnames <- c("男性", "女性") # 行名
cnames <- c("未婚", "既婚") # 列名
m.1 <- matrix(d, 2, 2,  # nrow=2, ncol=2 , 入力は列方向
              dimnames=list(rnames, cnames))  # 行,列名を入れる
m.1
##      未婚 既婚
## 男性  201  231
## 女性  183  285
m.11 <- matrix(d, 2, 2,  
              dimnames=list(c("男性", "女性"),c("未婚", "既婚")))
m.11
##      未婚 既婚
## 男性  201  231
## 女性  183  285
m.2 <- matrix(d, 2, 2, byrow = T ,  # byrow = Tで入力行方向
              dimnames=list(rnames, cnames))
m.2
##      未婚 既婚
## 男性  201  183
## 女性  231  285
# Matrixの特定の要素を参照
m.1[1,1] # 1行1列目
## [1] 201
m.1[1,1:2]   # 1行1,2列目
## 未婚 既婚 
##  201  231
# 行,列の統計情報を得る
m.1
##      未婚 既婚
## 男性  201  231
## 女性  183  285
sum(m.1[,2]) # 2列目の合計
## [1] 516
sum(m.1[1,]) # 1行目の合計
## [1] 432
sum(m.1)     # 総合計
## [1] 900
rowSums(m.1)        # 各行の合計
## 男性 女性 
##  432  468
apply(m.1, 1, sum) # 各行の合計 引数(x,1,関数),1が行
## 男性 女性 
##  432  468
colSums(m.1)        # 各列の合計
## 未婚 既婚 
##  384  516
apply(m.1, 2, sum) # 各列の合計計 引数(x,2,関数),2が列
## 未婚 既婚 
##  384  516

3 Data Frames

data frameはMatrixと異なり,numeric, character, factor, etc.といった異なる要素を持つことができる.

各列の行数は同じであること.

x <- c(1,2,3,4)
y <- c("H", "M", "L", NA)
z <- c(20 , 30 , 40 , 50)
d.f1 <- data.frame(x , y , z , stringsAsFactors = F) # stringsAsFactors=Fでyは文字列型
names(d.f1) <- c("ID","身長","Age") # 変数名
d.f1
##   ID 身長 Age
## 1  1    H  20
## 2  2    M  30
## 3  3    L  40
## 4  4 <NA>  50
str(d.f1)
## 'data.frame':    4 obs. of  3 variables:
##  $ ID  : num  1 2 3 4
##  $ 身長: chr  "H" "M" "L" NA
##  $ Age : num  20 30 40 50
d.f2 <- data.frame(x , y , z , stringsAsFactors = T) # yを因子型に
# 因子の順序はアルファベット順
str(d.f2)
## 'data.frame':    4 obs. of  3 variables:
##  $ x: num  1 2 3 4
##  $ y: Factor w/ 3 levels "H","L","M": 1 3 2 NA
##  $ z: num  20 30 40 50
y2 <- c("H", "M", "L", NA)
y2 <- factor(y2 , levels = c("H", "M", "L")) # levelsで順番を指定
d.f3 <- data.frame(x , y2 , z , stringsAsFactors = T) 
str(d.f3)
## 'data.frame':    4 obs. of  3 variables:
##  $ x : num  1 2 3 4
##  $ y2: Factor w/ 3 levels "H","M","L": 1 2 3 NA
##  $ z : num  20 30 40 50

変換注意点:数値をfactor型に変換しさらにas.numericで数値にもどすと値が変わることがあるのでこの作業はしない方がいい.

4 tibble(改良版data frame)

tibbleはtidyverseで標準となるデータ形式.

#library(tidyverse)
library(dplyr)
library(tibble)
x <- c(1,2,3,4)
y <- c("H", "M", "L", "LL")
z <- c(20 , 30 , 40 , 50)
df <- data.frame(x , y , z ) # データフレーム
df                 # data frame
##   x  y  z
## 1 1  H 20
## 2 2  M 30
## 3 3  L 40
## 4 4 LL 50
df %>% as_tibble() # tibble
## # A tibble: 4 × 3
##       x y         z
##   <dbl> <chr> <dbl>
## 1     1 H        20
## 2     2 M        30
## 3     3 L        40
## 4     4 LL       50
# Vectorで入力
tibble(
    x2 = c(1,2,3,4),
    y2 = c("H", "M", "L", "LL"),
    z2 = c(20 , 30 , 40 , 50)
    )
## # A tibble: 4 × 3
##      x2 y2       z2
##   <dbl> <chr> <dbl>
## 1     1 H        20
## 2     2 M        30
## 3     3 L        40
## 4     4 LL       50
# Matrixで入力
tribble(
    ~x3, ~y3,  ~z3,
    1,   "H",   20,
    2,   "M",   30,
    3,   "L",   40,
    4,   "LL",  50
    )
## # A tibble: 4 × 3
##      x3 y3       z3
##   <dbl> <chr> <dbl>
## 1     1 H        20
## 2     2 M        30
## 3     3 L        40
## 4     4 LL       50
library(MASS)
data(Cars93)
dat.c <- Cars93 %>% as_tibble()
dat.c
## # A tibble: 93 × 27
##    Manufacturer Model      Type   Min.Price Price Max.Price MPG.city MPG.highway
##    <fct>        <fct>      <fct>      <dbl> <dbl>     <dbl>    <int>       <int>
##  1 Acura        Integra    Small       12.9  15.9      18.8       25          31
##  2 Acura        Legend     Midsi…      29.2  33.9      38.7       18          25
##  3 Audi         90         Compa…      25.9  29.1      32.3       20          26
##  4 Audi         100        Midsi…      30.8  37.7      44.6       19          26
##  5 BMW          535i       Midsi…      23.7  30        36.2       22          30
##  6 Buick        Century    Midsi…      14.2  15.7      17.3       22          31
##  7 Buick        LeSabre    Large       19.9  20.8      21.7       19          28
##  8 Buick        Roadmaster Large       22.6  23.7      24.9       16          25
##  9 Buick        Riviera    Midsi…      26.3  26.3      26.3       19          27
## 10 Cadillac     DeVille    Large       33    34.7      36.3       16          25
## # ℹ 83 more rows
## # ℹ 19 more variables: AirBags <fct>, DriveTrain <fct>, Cylinders <fct>,
## #   EngineSize <dbl>, Horsepower <int>, RPM <int>, Rev.per.mile <int>,
## #   Man.trans.avail <fct>, Fuel.tank.capacity <dbl>, Passengers <int>,
## #   Length <int>, Wheelbase <int>, Width <int>, Turn.circle <int>,
## #   Rear.seat.room <dbl>, Luggage.room <int>, Weight <int>, Origin <fct>,
## #   Make <fct>
#表示されるデータは極めて小さい.下を見るとあと83行,18列あることがわかり,
#その後ろが表示されていない変数名.冒頭に93行27列のデータであると表示されている.
glimpse(dat.c) # データ構造,データ全体を見るときはview()
## Rows: 93
## Columns: 27
## $ Manufacturer       <fct> Acura, Acura, Audi, Audi, BMW, Buick, Buick, Buick,…
## $ Model              <fct> Integra, Legend, 90, 100, 535i, Century, LeSabre, R…
## $ Type               <fct> Small, Midsize, Compact, Midsize, Midsize, Midsize,…
## $ Min.Price          <dbl> 12.9, 29.2, 25.9, 30.8, 23.7, 14.2, 19.9, 22.6, 26.…
## $ Price              <dbl> 15.9, 33.9, 29.1, 37.7, 30.0, 15.7, 20.8, 23.7, 26.…
## $ Max.Price          <dbl> 18.8, 38.7, 32.3, 44.6, 36.2, 17.3, 21.7, 24.9, 26.…
## $ MPG.city           <int> 25, 18, 20, 19, 22, 22, 19, 16, 19, 16, 16, 25, 25,…
## $ MPG.highway        <int> 31, 25, 26, 26, 30, 31, 28, 25, 27, 25, 25, 36, 34,…
## $ AirBags            <fct> None, Driver & Passenger, Driver only, Driver & Pas…
## $ DriveTrain         <fct> Front, Front, Front, Front, Rear, Front, Front, Rea…
## $ Cylinders          <fct> 4, 6, 6, 6, 4, 4, 6, 6, 6, 8, 8, 4, 4, 6, 4, 6, 6, …
## $ EngineSize         <dbl> 1.8, 3.2, 2.8, 2.8, 3.5, 2.2, 3.8, 5.7, 3.8, 4.9, 4…
## $ Horsepower         <int> 140, 200, 172, 172, 208, 110, 170, 180, 170, 200, 2…
## $ RPM                <int> 6300, 5500, 5500, 5500, 5700, 5200, 4800, 4000, 480…
## $ Rev.per.mile       <int> 2890, 2335, 2280, 2535, 2545, 2565, 1570, 1320, 169…
## $ Man.trans.avail    <fct> Yes, Yes, Yes, Yes, Yes, No, No, No, No, No, No, Ye…
## $ Fuel.tank.capacity <dbl> 13.2, 18.0, 16.9, 21.1, 21.1, 16.4, 18.0, 23.0, 18.…
## $ Passengers         <int> 5, 5, 5, 6, 4, 6, 6, 6, 5, 6, 5, 5, 5, 4, 6, 7, 8, …
## $ Length             <int> 177, 195, 180, 193, 186, 189, 200, 216, 198, 206, 2…
## $ Wheelbase          <int> 102, 115, 102, 106, 109, 105, 111, 116, 108, 114, 1…
## $ Width              <int> 68, 71, 67, 70, 69, 69, 74, 78, 73, 73, 74, 66, 68,…
## $ Turn.circle        <int> 37, 38, 37, 37, 39, 41, 42, 45, 41, 43, 44, 38, 39,…
## $ Rear.seat.room     <dbl> 26.5, 30.0, 28.0, 31.0, 27.0, 28.0, 30.5, 30.5, 26.…
## $ Luggage.room       <int> 11, 15, 14, 17, 13, 16, 17, 21, 14, 18, 14, 13, 14,…
## $ Weight             <int> 2705, 3560, 3375, 3405, 3640, 2880, 3470, 4105, 349…
## $ Origin             <fct> non-USA, non-USA, non-USA, non-USA, non-USA, USA, U…
## $ Make               <fct> Acura Integra, Acura Legend, Audi 90, Audi 100, BMW…

5 List

リストは異なるデータ構造を複数個格納することができるデータ構造

#list関数を使う.4種類の異なる構造のデータをlist構造に
list <- list(m = m.1 , d.f = d.f1 , id = seq(1:10) , col = c("red" , "black" ,"blue")) 
list 
## $m
##      未婚 既婚
## 男性  201  231
## 女性  183  285
## 
## $d.f
##   ID 身長 Age
## 1  1    H  20
## 2  2    M  30
## 3  3    L  40
## 4  4 <NA>  50
## 
## $id
##  [1]  1  2  3  4  5  6  7  8  9 10
## 
## $col
## [1] "red"   "black" "blue"
length(list) # 要素数の確認
## [1] 4
names(list)  # 要素の名前を確認
## [1] "m"   "d.f" "id"  "col"
# 数値解析の返り値はlist型が多い.例えば固有値分解
cor <- matrix(c(1 , 0.7 ,
         0.7 , 1),2,2)
eg <- eigen(cor)
eg
## eigen() decomposition
## $values
## [1] 1.7 0.3
## 
## $vectors
##           [,1]       [,2]
## [1,] 0.7071068 -0.7071068
## [2,] 0.7071068  0.7071068
length(eg)
## [1] 2
eg[1]  # 1番目の固有値にアクセス,返り値はlist
## $values
## [1] 1.7 0.3
class(eg[1])
## [1] "list"
eg[[1]] # 1番目の固有値にアクセス,[[]]で返り値はdata
## [1] 1.7 0.3
class(eg[[1]])
## [1] "numeric"
eg[[1]]^2   # 計算可能
## [1] 2.89 0.09
eg$values  # $でアクセス,返り値はdata
## [1] 1.7 0.3

6 Array (配列)

Array:Matrixを3次元以上の多次元を持つことができる

ax <- c(1,2,3,4)
ay <- c(5,6,7,8)
az <- c(9,10,11,12)
ar <- array(c(ax , ay , az),dim = c(2,2,3))
ar
## , , 1
## 
##      [,1] [,2]
## [1,]    1    3
## [2,]    2    4
## 
## , , 2
## 
##      [,1] [,2]
## [1,]    5    7
## [2,]    6    8
## 
## , , 3
## 
##      [,1] [,2]
## [1,]    9   11
## [2,]   10   12

7 ts(Time-series)

vector (single time-series),matrix (multivariate time-series)

ts(1:10, start = 2020) # 2020年から10個のデータ
## Time Series:
## Start = 2020 
## End = 2029 
## Frequency = 1 
##  [1]  1  2  3  4  5  6  7  8  9 10
ts(1:24, frequency = 12, start = c(2020, 3)) # 2020年3月から月単位の24個のデータ
##      Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec
## 2020           1   2   3   4   5   6   7   8   9  10
## 2021  11  12  13  14  15  16  17  18  19  20  21  22
## 2022  23  24
set.seed(123)
r <- floor(runif(24 , min = 1 , max = 50))  # 24個の整数の一様乱数
ts(r , frequency = 12, start = c(2020, 4))  # 2020年4月から24ヶ月
##      Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec
## 2020              15  39  21  44  47   3  26  44  28
## 2021  23  47  23  34  29   6  45  13   3  17  47  44
## 2022  34  32  49
r4 <- floor(runif(12 , min = 1 , max = 50)) # 12個の乱数
ts(r4, frequency = 4, start = c(2020, 1))  # 四半期データが12(3年間)
##      Qtr1 Qtr2 Qtr3 Qtr4
## 2020   33   35   27   30
## 2021   15    8   48   45
## 2022   34   39    2   24
# 日別
y <- floor(runif(29 ,20,200)) # 24個の整数の一様乱数
d.ts <- ts(y , frequency = 7)
names(d.ts) <- seq(as.Date("2000-02-01"),
                   as.Date("2000-2-29"), by = "days")
d.ts   # 単純に7日で区切っている(カレンダーを参照していない)
## Time Series:
## Start = c(1, 1) 
## End = c(5, 1) 
## Frequency = 7 
## 2000-02-01 2000-02-02 2000-02-03 2000-02-04 2000-02-05 2000-02-06 2000-02-07 
##        156         58         77         61         45         94         94 
## 2000-02-08 2000-02-09 2000-02-10 2000-02-11 2000-02-12 2000-02-13 2000-02-14 
##         86         47         44         61        103         67        174 
## 2000-02-15 2000-02-16 2000-02-17 2000-02-18 2000-02-19 2000-02-20 2000-02-21 
##         28         99        163         41        120         57         42 
## 2000-02-22 2000-02-23 2000-02-24 2000-02-25 2000-02-26 2000-02-27 2000-02-28 
##        155        181         87        139         37         89         69 
## 2000-02-29 
##        166

8 xts(eXtensible Time Series)

ts型は日単位のデータに弱いという欠点がある

xts型データ作成には日付を指定したmatrix型データが便利

library(xts)
y <- floor(runif(39 ,20,200)) # 39個の整数の一様乱数
f.day <- matrix( y,
                 dimnames = list(
                     as.character(seq(as.Date("2000-02-01"), # 2000年は閏年
                                      as.Date("2000-03-10"), by = "day"))), 
                 ncol = 1)
f.day   
##            [,1]
## 2000-02-01  100
## 2000-02-02  165
## 2000-02-03  166
## 2000-02-04  162
## 2000-02-05   99
## 2000-02-06  155
## 2000-02-07  133
## 2000-02-08  147
## 2000-02-09   20
## 2000-02-10  105
## 2000-02-11   59
## 2000-02-12   88
## 2000-02-13  130
## 2000-02-14   83
## 2000-02-15   40
## 2000-02-16   63
## 2000-02-17  140
## 2000-02-18   95
## 2000-02-19  161
## 2000-02-20   38
## 2000-02-21   98
## 2000-02-22  197
## 2000-02-23  180
## 2000-02-24  179
## 2000-02-25   51
## 2000-02-26   43
## 2000-02-27  137
## 2000-02-28   81
## 2000-02-29  138
## 2000-03-01   77
## 2000-03-02   53
## 2000-03-03  160
## 2000-03-04   36
## 2000-03-05  104
## 2000-03-06  112
## 2000-03-07  127
## 2000-03-08   79
## 2000-03-09  107
## 2000-03-10  191
xts.d <- as.xts(f.day)   # カレンダーを参照している
xts.d["2000-02-10"]    # 日にちを指定して取り出す
##            [,1]
## 2000-02-10  105
xts.d["2000-02-01::2000-02-07"] # 区間を指定して取り出す :: or /
##            [,1]
## 2000-02-01  100
## 2000-02-02  165
## 2000-02-03  166
## 2000-02-04  162
## 2000-02-05   99
## 2000-02-06  155
## 2000-02-07  133
# csvデータをxts型で読み込む場合は一度zoo型で読み込む
# as.xts(read.zoo(data))
# 週で集計
#2000年2月は1日(火)、7日、14日、21日、28日が月曜日
week <- apply.weekly(xts.d , sum)
week  
##            [,1]
## 2000-02-07  980
## 2000-02-14  632
## 2000-02-21  635
## 2000-02-28  868
## 2000-03-06  680
## 2000-03-10  504
sum(xts.d["2000-02-01::2000-02-07"]) # 1日〜7日の合計は980
## [1] 980