R has a wide variety of data types including scalars, vectors (numerical, character, logical), matrices, data frames, and lists.
<- c(-1.1 , -0.5 , 1 , 2.2 , 3 , 5 , 6.6 , 10) # numeric
x x
## [1] -1.1 -0.5 1.0 2.2 3.0 5.0 6.6 10.0
<- c("大竹" , "Otake" , "オオタケ" , "おおたけ") # character
y y
## [1] "大竹" "Otake" "オオタケ" "おおたけ"
<- c("TRUE" , "TRUE" , "FALSE" , "TRUE" , "FALSE") # logical
z z
## [1] "TRUE" "TRUE" "FALSE" "TRUE" "FALSE"
# Vectorの特定の要素を参照
c(1,4)] # xの1,4番目を参照 x[
## [1] -1.1 2.2
<= 1] # xの1以下を参照 x[x
## [1] -1.1 -0.5 1.0
<- seq(1:8) # 連番
s s
## [1] 1 2 3 4 5 6 7 8
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
+ s # Vectorの和,x+s x
## [1] -0.1 1.5 4.0 6.2 8.0 11.0 13.6 18.0
- s # Vectorの差,x-s x
## [1] -2.1 -2.5 -2.0 -1.8 -2.0 -1.0 -0.4 2.0
* s # Vectorの積,x*s x
## [1] -1.1 -1.0 3.0 8.8 15.0 30.0 46.2 80.0
/ s # Vectorの商,x/s x
## [1] -1.1000000 -0.2500000 0.3333333 0.5500000 0.6000000 0.8333333 0.9428571
## [8] 1.2500000
# matrix(data = NA, nrow = 1, ncol = 1, byrow = FALSE, dimnames = NULL)
<- c(201,183,
d 231,285)
<- c("男性", "女性") # 行名
rnames <- c("未婚", "既婚") # 列名
cnames .1 <- matrix(d, 2, 2, # nrow=2, ncol=2 , 入力は列方向
mdimnames=list(rnames, cnames)) # 行,列名を入れる
.1 m
## 未婚 既婚
## 男性 201 231
## 女性 183 285
.11 <- matrix(d, 2, 2,
mdimnames=list(c("男性", "女性"),c("未婚", "既婚")))
.11 m
## 未婚 既婚
## 男性 201 231
## 女性 183 285
.2 <- matrix(d, 2, 2, byrow = T , # byrow = Tで入力行方向
mdimnames=list(rnames, cnames))
.2 m
## 未婚 既婚
## 男性 201 183
## 女性 231 285
# Matrixの特定の要素を参照
.1[1,1] # 1行1列目 m
## [1] 201
.1[1,1:2] # 1行1,2列目 m
## 未婚 既婚
## 201 231
# 行,列の統計情報を得る
.1 m
## 未婚 既婚
## 男性 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
data frameはMatrixと異なり,numeric, character, factor, etc.といった異なる要素を持つことができる.
各列の行数は同じであること.
<- c(1,2,3,4)
x <- c("H", "M", "L", NA)
y <- c(20 , 30 , 40 , 50)
z <- data.frame(x , y , z , stringsAsFactors = F) # stringsAsFactors=Fでyは文字列型
d.f1 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
<- data.frame(x , y , z , stringsAsFactors = T) # yを因子型に
d.f2 # 因子の順序はアルファベット順
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
<- c("H", "M", "L", NA)
y2 <- factor(y2 , levels = c("H", "M", "L")) # levelsで順番を指定
y2 <- data.frame(x , y2 , z , stringsAsFactors = T)
d.f3 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で数値にもどすと値が変わることがあるのでこの作業はしない方がいい.
tibbleはtidyverseで標準となるデータ形式.
#library(tidyverse)
library(dplyr)
library(tibble)
<- c(1,2,3,4)
x <- c("H", "M", "L", "LL")
y <- c(20 , 30 , 40 , 50)
z <- data.frame(x , y , z ) # データフレーム
df # data frame df
## x y z
## 1 1 H 20
## 2 2 M 30
## 3 3 L 40
## 4 4 LL 50
%>% as_tibble() # tibble df
## # 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)
<- Cars93 %>% as_tibble()
dat.c 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…
リストは異なるデータ構造を複数個格納することができるデータ構造
#list関数を使う.4種類の異なる構造のデータをlist構造に
<- list(m = m.1 , d.f = d.f1 , id = seq(1:10) , col = c("red" , "black" ,"blue"))
list 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型が多い.例えば固有値分解
<- matrix(c(1 , 0.7 ,
cor 0.7 , 1),2,2)
<- eigen(cor)
eg 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
1] # 1番目の固有値にアクセス,返り値はlist eg[
## $values
## [1] 1.7 0.3
class(eg[1])
## [1] "list"
1]] # 1番目の固有値にアクセス,[[]]で返り値はdata eg[[
## [1] 1.7 0.3
class(eg[[1]])
## [1] "numeric"
1]]^2 # 計算可能 eg[[
## [1] 2.89 0.09
$values # $でアクセス,返り値はdata eg
## [1] 1.7 0.3
Array:Matrixを3次元以上の多次元を持つことができる
<- c(1,2,3,4)
ax <- c(5,6,7,8)
ay <- c(9,10,11,12)
az <- array(c(ax , ay , az),dim = c(2,2,3))
ar 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
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)
<- floor(runif(24 , min = 1 , max = 50)) # 24個の整数の一様乱数
r 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
<- floor(runif(12 , min = 1 , max = 50)) # 12個の乱数
r4 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
# 日別
<- floor(runif(29 ,20,200)) # 24個の整数の一様乱数
y <- ts(y , frequency = 7)
d.ts names(d.ts) <- seq(as.Date("2000-02-01"),
as.Date("2000-2-29"), by = "days")
# 単純に7日で区切っている(カレンダーを参照していない) d.ts
## 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
ts型は日単位のデータに弱いという欠点がある
xts型データ作成には日付を指定したmatrix型データが便利
library(xts)
<- floor(runif(39 ,20,200)) # 39個の整数の一様乱数
y <- matrix( y,
f.day 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
<- as.xts(f.day) # カレンダーを参照している
xts.d "2000-02-10"] # 日にちを指定して取り出す xts.d[
## [,1]
## 2000-02-10 105
"2000-02-01::2000-02-07"] # 区間を指定して取り出す :: or / xts.d[
## [,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日が月曜日
<- apply.weekly(xts.d , sum)
week 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