Rのデータの型 ---初心者向け---

###### tags: `rBasicLearning`
# データの型
## データ型の種類
### 数値型
数値型は, 以下のようなものである.
typeof(x)で, xのデータ型を確かめることができる.

```r
# Numeric

n1 <- 15  # Double precision by default
n1
typeof(n1)

n2 <- 1.5
n2
typeof(n2)
```
``` r
> n1 <- 15  # Double precision by default
> n1
[1] 15
> typeof(n1)
[1] "double"
> n2 <- 1.5
> n2
[1] 1.5
> typeof(n2)
[1] "double"
```
### 文字型
文字型は, 以下のようなものである.

```r
## Character

c1 <- "c"
c1
typeof(c1)

c2 <- "a string of text"
c2
typeof(c2)
```
``` r
> c1 <- "c"
> c1
[1] "c"
> typeof(c1)
[1] "character"
> 
> c2 <- "a string of text"
> c2
[1] "a string of text"
> typeof(c2)
[1] "character"
```

### 論理型
論理型は, 以下のようなものである.
簡単に言うと, "TRUE" か "FALSE"である.
"T", "F" のみでも認識してくれる.

```r
# Logical

l1 <- TRUE
l1
typeof(l1)

l2 <- F
l2
typeof(l2)
```
``` r
> # Logical
> 
> l1 <- TRUE
> l1
[1] TRUE
> typeof(l1)
[1] "logical"
> 
> l2 <- F
> l2
[1] FALSE
> typeof(l2)
[1] "logical"
```

## データの構造
### ベクトル
一次元のデータ列をまとめたもの.
データ列の()の前に「鎖状に繋げる」を意味する "concatenate" の "c" をつける

```r
## Vector ##################################################

v1 <- c(1, 2, 3, 4, 5)
v1
is.vector(v1)

v2 <- c("a", "b", "c")
v2
is.vector(v2)

v3 <- c(TRUE, TRUE, FALSE, FALSE, TRUE)
v3
is.vector(v3)
```
``` r
> v1 <- c(1, 2, 3, 4, 5)
> v1
[1] 1 2 3 4 5
> is.vector(v1)
[1] TRUE
> 
> v2 <- c("a", "b", "c")
> v2
[1] "a" "b" "c"
> is.vector(v2)
[1] TRUE
> 
> v3 <- c(TRUE, TRUE, FALSE, FALSE, TRUE)
> v3
[1]  TRUE  TRUE FALSE FALSE  TRUE
> is.vector(v3)
[1] TRUE
```

### 行列
列ベクトルを複数組み合わせたもの. 
数字をs×t行列に収めたものとも考えられる.
nrow = x で, 行の数を指定.
指定したベクトルの要素は, 一列ごとに入れられる.
byrow = TRUEとすると, 指定したベクトルの要素は, 一行ごとに入れられる.

```r
## Matrix ##################################################

m1 <- matrix(c(T, T, F, F, T, F), nrow = 2)
m1

m2 <- matrix(c("a", "b", 
               "c", "d"), 
               nrow = 2,
               byrow = T)
m2

m3 <- matrix(c("a", "b", 
               "c", "d"), 
             nrow = 2)
m3
```
``` r
> m1 <- matrix(c(T, T, F, F, T, F), nrow = 2)
> m1
     [,1]  [,2]  [,3]
[1,] TRUE FALSE  TRUE
[2,] TRUE FALSE FALSE
> 
> m2 <- matrix(c("a", "b", 
+                "c", "d"), 
+                nrow = 2,
+                byrow = T)
> m2
     [,1] [,2]
[1,] "a"  "b" 
[2,] "c"  "d" 
> 
> m3 <- matrix(c("a", "b", 
+                "c", "d"), 
+              nrow = 2)
> m3
     [,1] [,2]
[1,] "a"  "c" 
[2,] "b"  "d" 
```
### array型
array型でも, 行列を作ることができる. 
最初にデータを与え, その後に次元（行, 列, 表の数）を指定する.

```r
## Array ###################################################

# Give data, then dimemensions (rows, columns, tables)
a1 <- array(c( 1:24), c(4, 3, 2))
a1
```
``` r
> # Give data, then dimemensions (rows, columns, tables)
> a1 <- array(c( 1:24), c(4, 3, 2))
> a1
, , 1

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

, , 2

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

```
### データフレーム
データフレームは, 同じ長さのベクトルを組み合わせることができる.
cbind(ベクトル1, ベクトル2, …)で組み合わせる.
しかし, cbindで組み合わせただけでは, 全てが文字型に型変換されてしまっているため, これをデータフレーム型に変えるために, as.data.frameを使う.
データフレームは, 違う型の変数の列ベクトルを, 一列ずつ並べているだけ.

```r
## Data frame ##############################################

# Can combine vectors of the same length

vNumeric   <- c(1, 2, 3)
vCharacter <- c("a", "b", "c")
vLogical   <- c(T, F, T)

dfa <- cbind(vNumeric, vCharacter, vLogical)
dfa  # Matrix of one data type

df <- as.data.frame(cbind(vNumeric, vCharacter, vLogical))
df  # Makes a data frame with three different data types
```
``` r
> ## Data frame ##############################################
> 
> # Can combine vectors of the same length
> 
> vNumeric   <- c(1, 2, 3)
> vCharacter <- c("a", "b", "c")
> vLogical   <- c(T, F, T)
> 
> dfa <- cbind(vNumeric, vCharacter, vLogical)
> dfa  # Matrix of one data type
     vNumeric vCharacter vLogical
[1,] "1"      "a"        "TRUE"  
[2,] "2"      "b"        "FALSE" 
[3,] "3"      "c"        "TRUE"  
> 
> df <- as.data.frame(cbind(vNumeric, vCharacter, vLogical))
> df  # Makes a data frame with three different data types
  vNumeric vCharacter vLogical
1        1          a     TRUE
2        2          b    FALSE
3        3          c     TRUE
```
### list
list型によっても, 違う型のデータを組み合わせることができる.

```r
## List ####################################################

o1 <- c(1, 2, 3)
o2 <- c("a", "b", "c", "d")
o3 <- c(T, F, T, T, F)

list1 <- list(o1, o2, o3)
list1

list2 <- list(o1, o2, o3, list1)  # Lists within lists!
list2
```
``` r
> list1 <- list(o1, o2, o3)
> list1
[[1]]
[1] 1 2 3

[[2]]
[1] "a" "b" "c" "d"

[[3]]
[1]  TRUE FALSE  TRUE  TRUE FALSE

> 
> list2 <- list(o1, o2, o3, list1)  # Lists within lists!
> list2
[[1]]
[1] 1 2 3

[[2]]
[1] "a" "b" "c" "d"

[[3]]
[1]  TRUE FALSE  TRUE  TRUE FALSE

[[4]]
[[4]][[1]]
[1] 1 2 3

[[4]][[2]]
[1] "a" "b" "c" "d"

[[4]][[3]]
[1]  TRUE FALSE  TRUE  TRUE FALSE
```
## データの型の強制
自分の使いたいデータの型出ない時, それを強制することが必要になってくる.

### 浮動少数型から整数型への強制

```r
## Coerce numeric to integer ###############################

(coerce2 <- 5)
typeof(coerce2)

(coerce3 <- as.integer(5))
typeof(coerce3)
```
``` r
> ## Coerce numeric to integer ###############################
> 
> (coerce2 <- 5)
[1] 5
> typeof(coerce2)
[1] "double"
> 
> (coerce3 <- as.integer(5))
[1] 5
> typeof(coerce3)
[1] "integer"
```
### 文字型から数値型に変換
```r
## Coerce character to numeric #############################

(coerce4 <- c("1", "2", "3"))
typeof(coerce4)

(coerce5 <- as.numeric(c("1", "2", "3")))
typeof(coerce5)
```
``` r
> ## Coerce numeric to integer ###############################
> 
> (coerce2 <- 5)
[1] 5
> typeof(coerce2)
[1] "double"
> 
> (coerce3 <- as.integer(5))
[1] 5
> typeof(coerce3)
[1] "integer"
> (coerce4 <- c("1", "2", "3"))
[1] "1" "2" "3"
> typeof(coerce4)
[1] "character"
> 
> (coerce5 <- as.numeric(c("1", "2", "3")))
[1] 1 2 3
> typeof(coerce5)
[1] "double"
```


### 行列からデータフレームに変換
```r
## Coerce matrix to data frame #############################

(coerce6 <- matrix(1:9, nrow= 3))
is.matrix(coerce6)

(coerce7 <- as.data.frame(matrix(1:9, nrow= 3)))
is.data.frame(coerce7)
```
``` r
> ## Coerce matrix to data frame #############################
> 
> (coerce6 <- matrix(1:9, nrow= 3))
     [,1] [,2] [,3]
[1,]    1    4    7
[2,]    2    5    8
[3,]    3    6    9
> is.matrix(coerce6)
[1] TRUE
> 
> (coerce7 <- as.data.frame(matrix(1:9, nrow= 3)))
  V1 V2 V3
1  1  4  7
2  2  5  8
3  3  6  9
> is.data.frame(coerce7)
[1] TRUE
```