R言語（自分メモ）

# カラーパレット
## colomap 使う

* Ubuntu 14.04

ディストリビューション毎に事前にパッケージに必要なライブラリを入れる。

```shell-session
# apt-get install libcurl4-openssl-dev libv8-3.14-dev
# R
# install.packages('colormap')
# library('colormap')
```

```R
# カラーパレットの表示:colormapコマンド
par(mfrow = c(44,1))
par(mar = rep(0.01, 4))
for(i in seq(colormaps)) { 
  barplot(rep(1, 72), yaxt = "n", space = c(0, 0), border = NA,
          col = colormap(colormap = colormaps[[i]]), main = sprintf("\n%s", names(colormaps[i])))
}
 
plot(hoge$aaa, col = colormap(colormap = colormaps$blackbody))
```

参考：https://www.karada-good.net/analyticsr/r-483

# レーダチャート（蜘蛛の巣的な）

いくつか方法あるぽいが、plotrixというパッケージを使うと簡単そうだったのでそれを使った。

* 参考 http://qiita.com/epsilonminder/items/732d71262778a368cae0
* help(radial.plot)で慣れてる人ならだいたいは予測つく

```r

install.packages("plotrix")
library(plotrix)

radial.plot(DF,
            main = "タイトル",
            labels = list,           # ラベル名のリスト
            line.col="red",          # ラインの色 
            lwd = 2 ,                # ラインの太さ
            rp.type = "p",           # グラフタイプ
            radial.lim = c(0,4),     # 円の外側への距離
            start=pi/2,              # グラフ描画の開始位置、ラジアンで指定
            clockwise = TRUE,        # 時計回りにプロット
            label.prop = 1.1,        # ラベル文字と円との距離
            grid.col ="gray",        # グリッド色
            grid.bg = "transparent", # 背景透明
            show.grid.labels=-1,     # 値の位置（-1で北方向）
            boxed.radial = FALSE)    # デフォで数字はボックス白枠の中にある

# 描画時に描画形式とラベルフォントの調整
par(mfrow=c(2,3),cex.axis=0.5)
radial.plot()
```

# pie チャート（さくっと版）
カテゴリ集計を円でサクッと

```r
pie(sort(table(tmp_dep), decreasing = T),
    radius=1,
    clockwise=T,
    border="#ffffff",
    main="ここにタイトルをおく",
    cex.main=2)
```

# 特定の列の特定の文字を含むサブセットDFを抜く

list はベクトル

```r
new_df <- subset(org_df, col1 %in% list)
```

# X軸ラベルのフォントのサイズ
* **boxplot** : cex.axis
* **barplot** : cex.names

# ある条件下における値変更（ifelse）
DF$Aが"hoge"なら100、そうじゃないならNA

```r
DF$A <- ifelse(DF$A == "hoge",100,NA)
```

# ある列を基準にデータフレームを並べ替える(order)
## 昇順（order）
```r
DF[order(DF$col1),]
```

## 降順（order , decreasing = T）
```r
DF[order(DF$col1 , decreasing = T),]
```
## 複数の列を基準とする場合、カンマで並べる

```r
DF[order(DF$col1 , DF$col1 , decreasing = T),]
```

# 列に対して、ある条件に合った文字を変更する
```r
# DF$V1で "3" を "あいうえお" に変換する
DF$V1[DF$V1 == 3] <- "あいうえお"
```

# ベクトルを追加する

```r
> a <- sum(product_new$prof) / sum(product_all$prof) * 100
> a
[1] 40.80371
> a <- append(a,sum(product_renewal$prof)  / sum(project_all$prof) * 100)
> a
[1] 40.80371 27.84163
```


# 文字検索して抜き出す（grepl）
大文字小文字の区別をしない場合は **ignore.case = TRUE** をつける

```r
# subset にて
subset(DF, grepl("Zabbix",DF$Product,ignore.case = TRUE))

# aggregate にて
aggregate(grepl("HTTPD|Tomcat|JBoss",DF$Product),by=list(DF$month_bring),sum)
```

# 不要な因子を消す
subset 等で派生したデータフレームに不要（NAだったり要素が0だったり）な因子が残る件について、factorを使ってそれを消す

```r
DF$col1 <- factor(DF$col1)
```

# table 出力結果（クロス集計結果）をデータフレームにする

```r
DF1new <- as.data.frame.matrix(table(DF1$month,DF1$Product.Category))
DF1new$month <- rownames(DF1new)
rownames(DF1new) <- NULL
```

# 文字列の一部を抜き出す
例えば、「2016-01-01」となっている日付列（``` DF$date```）から月（```DF$month```）の行を作る

```r
DF$month<-substr(DF$date,1,7)
```
1つめから7つ目までを抜いて入れる、つまり「2016-01」まで

# 文字を挿入する

```r
> ORG
[1] "ABC"

> paste("ABC",ORG,sep=",")
[1] "ABC,123"

> paste(ORG,"EFG",sep=",")
[1] "123,EFG"
```

# マージ（merge）
DF1とDF2を同じ列 month をキーにマージ

* 全部残す＝＞all=T（無いセルは NA）
* 両方にあるものだけマージして残す＝＞all=F（デフォルト）
* 右側を残こす＝＞all.y=T（左のデータフレームでない行は消え、右のデータフレームだけにある行が残り、その値のない列は NA）
* 左側を残こす＝＞all.y=T（右のデータフレームでない行は消え、左のデータフレームだけにある行が残り、その値のない列は NA）

```r
> DF1
    month member age
1 2016-01  jacky  10
2 2016-05  sarah  20
3 2016-03    bob  10
4 2016-02   rucy  50
> DF2
    month value category
1 2016-01     5        a
2 2016-05     6        b
3 2016-04    10        c


> merge(DF1,DF2,by.x="month")
    month member age value category
1 2016-01  jacky  10     5        a
2 2016-05  sarah  20     6        b

> merge(DF1,DF2,by.x="month",all.x=T)
    month member age value category
1 2016-01  jacky  10     5        a
2 2016-02   rucy  50    NA     <NA>
3 2016-03    bob  10    NA     <NA>
4 2016-05  sarah  20     6        b

> merge(DF1,DF2,by.x="month",all.y=T)
    month member age value category
1 2016-01  jacky  10     5        a
2 2016-05  sarah  20     6        b
3 2016-04   <NA>  NA    10        c

> merge(DF1,DF2,by.x="month",all=T)
    month member age value category
1 2016-01  jacky  10     5        a
2 2016-02   rucy  50    NA     <NA>
3 2016-03    bob  10    NA     <NA>
4 2016-05  sarah  20     6        b
5 2016-04   <NA>  NA    10        c

```



# tapply で二次元
list を使う

```r
tapply(A$value,list(A$col1,A$col2),sum)
```

#関数

```r
testfunc <- function(x){
 # 処理部
 out <- tapply(x$col1,x$col2,sum)
 # 返す
 return(out)
}

# 呼び出し
tmp <- testfunc( x = abc )
```


#Rのアップデート

```r
install.packages("installr")
library(installr)
updateR()
```

#Rのプロキシ設定

```r
Sys.setenv(http_proxy="http://<proxy server>:<port>",
           http_proxy_usr="<id>:<pass>")
```
#table からデータフレーム作る

```r
DF <- as.data.frame.matrix(table(DF$month,DF$Product))
```


#sjisでcsvファイルを読み込みデータフレーム作る

```r
DF <- read.csv("data.csv",header = T , fileEncoding = "sjis")
```

#日付にする

```r
DF$ログイン日<-strptime(DF$ログイン日,"%Y/%m/%d")
```

#列を消す

```r
DF <- DF[,setdiff(colnames(DF),c("列１","列２","列３"))]
```

#オブジェクト全部消す


```r
rm(list=ls(all=TRUE)) 
```


#カイ二乗検定

```r
> tapply(DF$ratio,DF$weekday,mean)
   Fri    Mon    Thu    Tue    Wed 
91.025 49.900 81.800 73.850 86.900 

> chisq.test(tapply(DF$ratio,DF$weekday,mean))

	Chi-squared test for given probabilities

data:  tapply(DF$ratio, DF$weekday, mean)
X-squared = 13.842, df = 4, p-value = 0.007817
```
#データフレムをキャラクタに変換

```
DF <- as.character.Date(DF)
```

割合で集計（prop.table）

```
prop.table(table(DF$parameter))
```

#値を丸める（round）

```
> round(prop.table(table(DF$Understand)),digits = 2)
```

#空のセルをNAにする

```
df[df==""]<-NA
```

#NAを0にする（is.na）

```
DF[is.na(DF)] <- 0
```

#カレントディレクトリをセットする

```
setwd("/home/demo/test")
```

#CSSをセットする

```
options(rstudio.markdownToHTML =
  function(inputFile, outputFile) {
    require(markdown)
    markdownToHTML(inputFile, outputFile, stylesheet='custom.css')
  }
)
```

#指数表現にするか否かの閾値を設定する（デフォルトは 0）

```
options(scipen=1)
```

#特定の列を抜き出してデータフレーム作成

```
# Type列に"cifs"というのがあるRead列とWrite列を抜き出す
> new_df <- subset(org_df, Type == "cifs", select=c(Read,Write))


# 2015年度の分の売上データを抜き出す DF$date は日付型（POSIXlt）
subset(DF, as.Date(DF$date) > as.Date("2015-03-31") &
           as.Date(DF$date) < as.Date("2016-04-01")
      )
```



#出力の横幅調整

```
> options(width = 100)
```

#クロス集計（tapply）

```
> head(iris)
  Sepal.Length Sepal.Width Petal.Length Petal.Width Species
1          5.1         3.5          1.4         0.2  setosa
2          4.9         3.0          1.4         0.2  setosa
3          4.7         3.2          1.3         0.2  setosa
4          4.6         3.1          1.5         0.2  setosa
5          5.0         3.6          1.4         0.2  setosa
6          5.4         3.9          1.7         0.4  setosa

## Specie毎のSepal.Lengthの合計
> tapply(iris$Sepal.Length,iris$Species,sum)
    setosa versicolor  virginica
     250.3      296.8      329.4

## Specie毎のSepal.Lengthの平均
> tapply(iris$Sepal.Length,iris$Species,mean)
    setosa versicolor  virginica
     5.006      5.936      6.588
```

#単回帰分析（lm）

```
> result<-lm(Sepal.Length~Sepal.Width,iris)
> summary(result)

Call:
lm(formula = Sepal.Length ~ Sepal.Width, data = iris)

Residuals:
    Min      1Q  Median      3Q     Max
-1.5561 -0.6333 -0.1120  0.5579  2.2226

Coefficients:
            Estimate Std. Error t value Pr(>|t|)
(Intercept)   6.5262     0.4789   13.63   <2e-16 ***
Sepal.Width  -0.2234     0.1551   -1.44    0.152
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 0.8251 on 148 degrees of freedom
Multiple R-squared:  0.01382,   Adjusted R-squared:  0.007159
F-statistic: 2.074 on 1 and 148 DF,  p-value: 0.1519

```