R 列・行操作



## 列操作
##### mpgデータセット使用。
### select

```
##### select
select(.data=mpg, model)
select(.data=mpg, model,year,cyl,displ)
# どっちでも行ける
select(.data=mpg, 1,2,3)
select(.data=mpg, c(1,2,3))
# classだけいらないとき
select(.data=mpg, -class)
# classとyearがいらん時
select(mpg, -c(class,year))
```

#### In addition, you can use selection helpers. Some helpers select specific columns:

- everything(): Matches all variables.
- last_col()

```
# yearカラムを一番前に持ってくることができる。これだけだと微妙な機能。
select(mpg, year, everything())

mpg %>% select(everything())
# 最後の列をとってくる。
mpg %>% select(last_col())
# 1:最後の列からn番目までの列を選択。
mpg %>% select(1:last_col(0))
mpg %>% select(1:last_col(1))
mpg %>% select(1:last_col(2))
```

#### These helpers select variables by matching patterns in their names:
- starts_with(): Starts with a prefix.
- ends_with(): Ends with a suffix.
- contains(): Contains a literal string.
- matches(): Matches a regular expression.
- num_range(): Matches a numerical range like x01, x02, x03.

```
### starts_with()
?select
select(mpg, starts_with("c"))
# 大文字小文字区別なし
select(iris, starts_with("p"))
# 大文字小文字区別あり
select(iris, starts_with("p", ignore.case=FALSE))

### ends_with()
select(mpg,ends_with("r"))

### contains()
select(mpg,contains("s"))

### matches()

# dthで終わる列名の列を選択。便利。
dim(select(iris, matches("dth$")))
select(iris, matches("dth$"))


### num_range()
df <- as.data.frame(matrix(1:30, nrow = 3, ncol = 10))
colnames(df) <- c(paste0("beer", 1:5), paste0("sake0", 1:5))
ls(df)


  # matrix creates a matrix from the given set of values.
  matrix(1:1000, nrow = 10, ncol = 100)
  # The function data.frame() creates data frames, 
  # デフォで列名が通し番号になる
  tmp<-data.frame(matrix(1:500, nrow = 10, ncol = 50))
  
# X1~X7まで選択
select(tmp, num_range(prefix = "X", range = 1:7, width = 1))
# width	
# Optionally, the "width" of the numeric range. For example, a range of 2 gives "01", a range of three "001", etc
# 001,002といった列が簡単に選択できてすごい。分析のための機能が豊富だ…
select(tmp, num_range(prefix = "X", range = 1:20, width = 2))
```

```
# 正規表現を利用して一気に列を連番処理するコード。自由度が高い。
# Data frame attributes are preserved.
select(mpg, mから始まる列 = starts_with("m"), everything())
select(mpg, mから始まる列 = starts_with("z"), everything())
select(mpg, rを含むよ = contains("r"), everything())
select(mpg, rを含むよ = contains("r"))
```
## 行操作
### filter

例
- スポーツカー志向のおじさんが
 -  なるべく新しい車
 -  排気量が第三四分位点より高い
の条件を満たすようにデータセットを探索するコードは以下

```
filter(mpg,year==2008 & displ >2.5)
# パイプだとOR
filter(mpg,year==2008 | displ >2.5)

```
- documentを見る。
> retaining all rows that satisfy your conditions. To be retained, the row must produce a value of TRUE for all conditions.
-  logicalクラスを持つオブジェクトを作成し保持する行を選択することもできる。
-  pythonで自分でマスクを作るのと何ら変わらないことをdplyr::filterがやっている。

```
test<-data.frame(X=1:10)
mask<-test>5
filter(test, mask)
```

> There are many functions and operators that are useful 
when constructing the expressions used to filter the data:

- ==, >, >= etc
略
- &, |, !, xor()
- is.na()
- between(), near()

```
# EかJ
filter(diamonds, color=='E' | color=='J')
# (Eでない)∧(Iでない)∧(Jでない)
filter(diamonds, color != 'E' & color != 'I' & color != 'J')

test2<-data.frame(retu=c(1,2,3,4,5,NA,NA,NA))
sum(is.na(test2))
# NAである行を選択
filter(test2, is.na(retu))
# NAでない行を選択
filter(test2, !is.na(retu))
# between(列,開始値、終わり値)
filter(test2, between(retu,2,4))

# near
# This is a safe way of comparing if two vectors of floating point numbers are (pairwise) equal.
# This is safer than using ==, because it has a built in tolerance

# 計算機イプシロン未満?以下の誤差を許容する比較演算子だと思えばよい
# wikipediaによると計算機イプシロン（けいさんきイプシロン、英: machine epsilon）は、浮動小数点数において、「1より大きい最小の数」と1との差のこと
# 計算機イプシロンは2.220446e-16
.Machine$double.eps # 2.220446e-16
# sqrt(2^2)と2の誤差は計算機イプシロンより小さいらしい
near(sqrt(2^2),2)

# near(x, y, tol = .Machine$double.eps^0.5)
test2<-data.frame(retu=c(1.0,2.0,3.0,4.0,5.0,NA,NA,NA))
test3<-c(1.01,2.0,30.0,4.0,5.0,NA,NA,NA)
# どちらも正常に動作
# ①
filter(test2, near(retu, test3))
# ②
test3<-data.frame(retu=c(1.0,2.0,30.0,4.0,5.0,NA,NA,NA))
filter(test2, near(retu, test3))
```

```
### 文字列に対する操作
filter(diamonds, cut=="Premium")
filter(diamonds, cut!="Premium")

# c("Good","Very Good")のいずれかの要素に一致する
# SQLでいうところの述語論理INで ORの同値変換かな？
filter(diamonds, cut %in% c("Good","Very Good"))

# c("Good","Very Good")のいずれかの要素に一致しない行
# SQLでいうところの述語論理INで ORの同値変換かな？
filter(diamonds, !cut %in% c("Good","Very Good"))

# stringrを使用すると部分一致を実現できる
library(stringr)
# clarity列が"2"を含む行を選択
filter(diamonds, str_detect(clarity, "2"))
# trans列の行頭mで始まる行
filter(mpg2, str_detect(trans, "^m"))
```