一日一膳(当社比)

RとJavaと時々数学

Node.jsでexcelからデータ抽出してjsonにするプログラムかいてみた

どうもこんにちは.

最近冷やし中華ばかりたべている管理人です.

今日は,Node.jsでexcel操作するライブラリxlsx - npmexcelから抽出したデータをjson形式に書くプログラムをかいてみたのでメモとして残しておきます.

1.目的

次のような,excelシートsample.xlsxから各行をjson形式で取得して, test.xlsxに保存する プログラムを作成します.

firstname lastname
Takeshi Goda
Shizuka Minamoto
Honeo Sunekawa

javascriptコード


'use strict';

let ParseExcel = function() {
    this.methods = {};
    this.table = [];
};

ParseExcel.prototype = {
    /**
     * Excelから取得するデータのフィールド名と取得する関数
     * @param {string} fieldName 
     * @param {function getField(index, worksheet) {}}
     */
    setMethods:function(fieldName, getField) {
        this.methods[fieldName] = getField;
        return this;
    },
    /**
     * worksheet
     * @param {Array} rows worksheetからデータ取得する行番号
     * @param {*} worksheet ワークシート
     */
    setTable:function(rows, worksheet) {    
        rows.forEach((index) => {
            let record = {};
            Object.keys(this.methods).forEach((field) => {
                record[field] = this.methods[field](index, worksheet);
            });
            this.table.push(record);
        });
        return this;
    },
    /**
     * 取得したデータの取得
     */
    getTable:function() {
        return this.table;
    }
};

let parseExcel = new ParseExcel();

/** フィールドと取得関数を設定 */
parseExcel.setMethods('firstName', (index, worksheet) => {
    let cell = worksheet[`A${index}`];
    return !cell ? undefined : cell.v;
}).setMethods('lastName', (index, worksheet) => {
    let cell = worksheet[`B${index}`];
    return !cell ? undefined : cell.v;
})

const XLSX = require("xlsx");
// Workbookの読み込みや
const book = XLSX.readFile(__dirname + "/sample.xlsx");
// Sheet1を読み込むんや
const sheet1 = book.Sheets["Sheet1"];
//末端行を取得するで
let rowMax = XLSX.utils.decode_range(sheet1['!ref']).e.r

//sheet1の内容を取得するんや
let table = parseExcel.setTable(
    [...Array(rowMax).keys()].map((i) =>  i+2), sheet1)
    .getTable()

console.log(table);

//新規ワークブックや
let wb = XLSX.utils.book_new()
let sheetNew = XLSX.utils.json_to_sheet(table, 
    {header:['firstName','lastName'], skipHeader:false})

//newシートに保存するで
XLSX.utils.book_append_sheet(wb, sheetNew, "new")

//test.xlsxに保存するんや
XLSX.writeFile(wb, "test.xlsx")
    

2.動作確認

nodeで実行してみると次のようになります.

[ { firstName: 'Takeshi', lastName: 'Goda' },
  { firstName: 'Shizuka', lastName: 'Minamoto' },
  { firstName: 'Honeo', lastName: 'Sunekawa' } ]

3.最後に

実は今回利用したsample.xlsxのように普通の形をした表データの整形なら XLSX.utils.sheet_to_jsonとか使えば良いと思いますが,取得したいセルの位置 が飛び飛びであるみたいなにも対応できるように実装しました.今後ももう少しxlsxライブラリの練習をしていきたいと思います...

Poisson過程とGamma分布

Poisson過程

 \lambda > 0をパラメータとし, X(t)が次の条件で与えられるPoisoon過程であるとします.

i.  X(0) = 0

ii.独立増分性( independent increment)
任意の 0 = t_{0} < t_{1} < t_{2} < \cdots < t_{s}に対して
 X(t_{j}) - X(t_{j - 1}) \quad (j = 1, \ldots s )は独立である.

iii. 任意の 0 \le t < uに対して
 X(u) - X(t) \sim {\sf Poisson}(\lambda (u - t))

 \lambda が次の事前分布に従うとします,
 \lambda \sim {\sf Gamma}(a, b), \quad a, b > 0.
ただしここで {\sf Gamma}(a, b)はガンマ分布でその確率密度関数 \displaystyle{p(\lambda) = \frac{b ^{a} \lambda ^{a - 1} e ^{- b \lambda}}{\Gamma (a)}}. です.
この場合, \lambdaの事後分布は次のようになります.

 \tau_{1} < \tau_{2} < \cdots < \tau_{r}をイベント発生時刻とした場合の \lambda の 事後分布 \lambda _{\text{posterior}}は次で与えられる
 \lambda _{\text{posterior}} \sim {\sf Gamma}(a + r, b + t_{r})

(導出)
 p( \lambda _{\text{posterior}})
 \propto p( \lambda ) p(X(\tau _{1}) = 1, X(\tau _{2}) = 2, \cdots, X(\tau _{r}) = r ~|~ \lambda)
 = p( \lambda ) p(X(\tau _{1}) = 1, X(\tau _{2}) - X(\tau _{1}) = 1, \cdots, X(\tau _{r}) - X(\tau _{r - 1}) = 1 ~|~ \lambda)
 \displaystyle{= p( \lambda) \prod _{j = 1}^{r}p(X(\tau _{j}) - X(\tau _{j - 1}) = 1 ~|~ \lambda) \quad (\tau _{0} := 0) }
 \displaystyle{\propto p( \lambda) \prod _{j = 1}^{r} \lambda e^{- \lambda (\tau _{j} - \tau _{j - 1})}}
 = p( \lambda) \lambda ^ {r} e^{ - \lambda t _{r}}
  \propto \lambda ^{a + r - 1} e ^{- \lambda ( b + t _{r})}
よって  \lambda _{\text{posterior}} \sim {\sf Gamma}(a + r, b + t _{r})がわかります.

tr(AB) = tr(BA)を世界一回りくどく証明する方法

 \require{AMScd}

どうもこんにちは.今回の記事の内容は線形代数についての記事です.

線形代数で,次の公式は大体の教科書に載っていると思います.

 A, B n次正方行列とするとき  {\rm tr} (AB) = {\rm tr} (BA).

今回の記事では,この公式の可換図式を使った回りくどい証明を紹介します(笑)

トレースを思い出す

 kを体, V k上有限次元の線形空間とする.

 k-線形写像
 \tau : V \otimes {\rm Hom}_k(V, k)  \rightarrow {\rm Hom} _k(V, V)

 \tau : v \otimes \phi \mapsto [ x \mapsto \phi(x) v ]

で定義する. V k上有限次元のとき, \tau k上同型になる.

また, k-線形写像 {\sf eval} : V \otimes {\rm Hom}_k(V, k) \rightarrow k

 {\sf eval }(v \otimes \phi) = \phi (v)

で定義する.

定義 トレース(跡) {\rm tr}:{\rm Hom}_k(V, V) \rightarrow k
 {\sf eval} \circ \tau ^{-1} : {\rm Hom}_k(V, V) \rightarrow k
で定義する.

以下,次を証明します

 f, g \in  {\rm Hom}_k(V, V)とするとき,
 {\rm tr } (f \circ g) = {\rm tr} (g \circ f)

ふつう教科書では,Vの基底を取って計算する証明が多いと思うけど,そうではない方法を紹介しましょう.

証明

補題I  f ^{\ast} : {\rm Hom}_k(V, k) \rightarrow {\rm Hom}_k(V, k) fの転置写像とする.このとき 次の可換図式が存在する.

 \begin{CD}
V \otimes {\rm Hom}_k(V, k)  @>{f \otimes {\rm id}}>> V \otimes {\rm Hom}_k(V, k) \\
@V{{\rm id} \otimes f^\ast }VV                                @V{\sf eval}VV \\
V \otimes {\rm Hom}_k(V, k)  @>{\sf eval}>>  k
\end{CD}

補題Iの証明  v \otimes \phi \in V \otimes {\rm Hom}_k(V, k)とするとき,
 {\sf eval} \circ ({f \otimes {\rm id}}) (v \otimes \phi)
 = {\sf eval} ( f(v) \otimes \phi)
 = \phi(f(v))
 = (f^{\ast} (\phi))(v)
 = {\sf eval} ( v \otimes  f^{\ast} (\phi) )
 = ({\sf eval} \circ ({{\rm id} \otimes f^\ast })) (v \otimes \phi)
より示せた.

補題II
次の可換図式が存在する.
 \begin{CD}
V \otimes {\rm Hom}_k(V, k)  @>\tau>> {\rm Hom}_k(V, V) \\
@V{f \otimes {\rm id}}VV                                @V{{\rm Hom}({\rm id}, f)}VV \\
V \otimes {\rm Hom}_k(V, k)  @>\tau>>   {\rm Hom}_k(V, V)
\end{CD}

補題IIの証明
 x \otimes \phi \in V \otimes {\rm Hom}_k(V, k)とすると,
 (\tau \circ ({f \otimes {\rm id}})) (x \otimes \phi) (-)
 = \tau(f(x) \otimes \phi) (-)
 = \phi(-) f(x)
 = f(\phi(-) x)
 = ({\rm Hom}({\rm id}, f) \circ \tau )(x \otimes \phi)(-) より示せた.

補題III 次の可換図式が存在する.
 \begin{CD}
V \otimes {\rm Hom}_k(V, k)  @>\tau>> {\rm Hom}_k(V, V) \\
@V{{\rm id} \otimes f ^{\ast}}VV                                @V{{\rm Hom}(f ^{\ast}, {\rm id})}VV \\
V \otimes {\rm Hom}_k(V, k)  @>\tau>>   {\rm Hom}_k(V, V)
\end{CD}

補題IIIの証明
 x \otimes \phi \in V \otimes {\rm Hom}_k(V, k)とすると,
 ({\rm Hom}(f ^{\ast}, {\rm id}) \circ \tau ) (x \otimes \phi ) (-)
 = \tau(x \otimes \phi) ( f (-) )
 = \phi ( f ( - ) ) x
 = f ^{\ast} (\phi) (-) x
 = \tau (x \otimes f^{\ast} (\phi)) (-)
 = (\tau \circ ({\rm id} \otimes f ^{\ast}) ) (x \otimes \phi) (-)
より示せた.

以上で準備がととのいました.

命題
 {\rm tr} \circ {\rm Hom}({\rm id}, f) = {\rm tr} \circ {\rm Hom}(f^\ast, {\rm id})
とくに, {\rm tr} (f \circ g) = {\rm tr} (g \circ f)

命題の証明

 {\rm tr} \circ {\rm Hom}({\rm id}, f)
   = ({\sf eval} \circ  \tau ^{-1} ) \circ {\rm Hom}({\rm id}, f) \quad \text{(トレースの定義)}
 = {\sf eval} \circ ( \tau ^{-1}  \circ {\rm Hom}({\rm id}, f) )
 = {\sf eval} \circ ( ( f  \otimes {\rm id}) \circ \tau ^{-1} ) \quad \text{ (補題IIの力)}
{ = ({\sf eval} \circ ( f  \otimes {\rm id}) ) \circ \tau ^{-1}  }
{=  ({\sf eval} \circ ({{\rm id} \otimes f ^{\ast} }) ) \circ \tau ^{-1} \quad \text{ (補題Iの力)} }
{= {\sf eval} \circ ( ({{\rm id} \otimes f ^{\ast} }) \circ \tau ^{-1} ) }
 = {\sf eval } \circ ( \tau ^{-1} \circ {\rm Hom}(f^\ast, {\rm id})) \quad \text{ (補題IIIの力)}
 = ({\sf eval } \circ  \tau ^{-1}) \circ {\rm Hom}(f^\ast, {\rm id})
 = {\rm tr} \circ {\rm Hom}(f^\ast, {\rm id})
よって示せました.

VSCodeで始めるSpringBoot(2) ~ 簡単なREST apiつくってみた

SpringBoot + SQLServer2017で簡単なREST apiを作ってみました.

GitHub - gradus-AP/springboot-simple-REST-api

SpringBootってなんやねんって方は,前回記事もご参考までに...

sonnamonyaro.hatenablog.com

環境

api概要

今回作ったのは,DBのCRUD操作をRESTサービスで提供するapiです.各CRUD操作とapi側の HTTPメソッドは次のように対応付けられます.

DB側 api側(HTTPメソッド) 操作の内容
Create POST リソースの新規作成
Read GET リソースの取得
Update PUT リソースの更新
Delete DELETE リソースの削除

DB

DB側では次のようなusersテーブルを用意しました.

フィールド名 制約
id INT IDENTITY(1, 1) PRIMARY KEY
name VARCHAR(255)

ここでid列のIDENTITY(1, 1)は,このフィールドの値を初期値1, 増分1で自動採番を行うというSQLServerのオプションです. 今回は,

apiの仕様

HTTPメソッド URL jsonリクエス 処理を内容
POST /api/users/ {name:{name}} 名前が{name}のユーザを新規作成
GET /api/users/ - usersテーブルの全レコード取得
GET /api/users/{id} - idが{id}であるユーザ名取得
PUT /api/users/{id} {name:{name}} idが{id}であるユーザ名を{name}へ変更
DELETE /api/users/{id} - idが{id}であるユーザを削除

動作確認script(PowerShell)

PowerShellターミナルからコマンドInvoke-WebRequestをたたいてHTTPリクエストを送ろう.

#POST user 'Yukichi Fukuzawa'を作成 
Invoke-WebRequest -Method Post -Body @{name='Yukichi Fukuzawa'} http://localhost:8080/api/users/

#GET user 'Yukichi Fukuzawa'が返される
Invoke-WebRequest http://localhost:8080/api/users/

#GET user 'Yukichi Fukuzawa'が返される
Invoke-WebRequest http://localhost:8080/api/users/1

#PUT user 'Yukichi Fukuzawa'が'Hideyo Noguchi'に変更
Invoke-WebRequest -Method PUT -Body {name='Hideyo Noguchi'} http://localhost:8080/users/api/1

#DELETE user 'Hideyo Noguchi'が削除される
Invoke-WebRequest -Method DELETE http://localhost:8080/users/api/1

#GET userは1件も登録されていない
Invoke-WebRequest http://localhost:8080/api/users/

参考

VSCodeで始めるSpringBoot(1)

案件の関係で勉強しはじめたSpring Bootのめも.

目次

Spting Boot

Spring Bootは,Webフレームワークのひとつ.Javaで書ける.

環境

環境
OS:Windows 10
JDK: 1.8.0_211
Apache Maven 3.6.1

あとVSCode拡張機能
SpringBoot Extension Pack
Spring Initializr Java Support
を導入しておいた.

とりあえずHello World!まで

ここでは,httpリクエストに対してHello World!するだけの極小webアプリケーションを作ってみましょう. 公式のgitレポジトリから,git cloneすればソースは手に入ります.

1.プロジェクト作成

Spring Initializr Java Supportを使えば,プロジェクトの作成をすることが出来る.
手順
1. VSCodeを開き,Ctrl + Shift +pで出てきた検索窓でSpring Initializr generate a Maven Projectを選択.
2.ウィザードに従って進む.途中で依存パッケージを選ぶところがあるが,とりあえずWEBだけ選択しておく.
3.完了

2.coding

プロジェクト作成時のGroup Id, artifactがそれぞれcom.example, demoの場合(デフォルト),src/main/java/com/example/demoにDemoApplicationクラスがつくられている.

package com.example.demo;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class DemoApplication {

    public static void main(String[] args) {
        SpringApplication.run(DemoApplication.class, args);
    }

}

さて,「httpリクエストに対してHello World!を返す」という処理を次のように書く.こうして@RequestMapping("リクエストurl")というアノテーションを付与したメソッドが,クライアントからのhttpリクエスト時の処理に紐づけされる.

package com.example.demo;

import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
class HelloWorld {

    @RequestMapping("/")
    String index() {
        return "Hello World!";
    }

}

3.ビルドとデプロイ

mvnでビルドする.

C:\Workspace\demo> mvn compile

コンパイルが通ったら,デプロイする.

C:\Workspace\demo> mvn spring-boot:run

ローカル起動の場合http://localhost:8080にアクセスすれば,画面にHello World!と表示される.

f:id:kimigayoseishou:20190518233534p:plain
画面

かなり寂しい画面だ.

基本情報技術者試験まであと一週間を切りました

(この行を消して、ここに「迷い」と「決断」について書いてください)

#「迷い」と「決断」

りっすん×はてなブログ特別お題キャンペーン〜りっすんブログコンテスト2019「迷い」と「決断」〜 Sponsored by イーアイデム

基本情報技術者試験とは

基本情報技術者試験とは,情報処理に関する知識を有することを示す国家資格です.毎年2回(4月と10月)開催される試験であり,この試験に合格すると 日曜日の朝に早起きできる能力 を客観的に示すことが出来ます.

合格率の推移

基本情報技術者試験の合格率は,大体20%~30%の間で推移しています. (基本情報技術者試験ドットコムより,統計を拝借しました) 以下,直近14回の応募者, 受験者, 合格者の情報です.

開催 応募者 受験者 合格者
24年春期 75,085人 52,582人 12,437人
24年秋期 79,674人 58,905人 15,987人
25年春期 66,667人 46,416人 10,674人
25年秋期 76,020人 55,426人 12,274人
26年春期 65,141人 46,005人 11,003人
26年秋期 74,577人 54,874人 12,950人
27年春期 65,570人 46,874人 12,174人
27年秋期 73,221人 54,347人 13,935人
28年春期 61,281人 44,184人 13,418人
28年秋期 75,095人 55,815人 13,173人
29年春期 67,784人 48,875人 10,975人
29年秋期 76,717人 56,377人 12,313人
30年春期 73,581人 51,377人 14,829人
30年秋期 82,347人 60,004人 13,723人

f:id:kimigayoseishou:20190414212151p:plain
基本情報技術者試験合格率推移

次回の合格率をブラウン運動モデル予測してみる

合格率をモデリングしてみます.  t回目の合格率を p_tとして,これが次のようなモデルで表されるとします.

 \displaystyle{{\rm logit}(p_t) =  {\rm logit}(p_{t - 1})  + \epsilon_t \quad ( \epsilon_t \sim N(0, \sigma ^2))}

ただし,ここで {\rm logit}(x) := \log \Bigl( \frac{x}{1-x} \Bigr)とおいた.

要は ブラウン運動 ですね.

以下Rパッケージの{dlm}で推定するコードです.


FE_stats_csv <- read.csv('FE_stats.csv', encoding = 'utf-8')
View(FE_stats_csv)

開催 <- paste("H",gsub("年秋期", "-10", gsub("年春期", "-04",FE_stats_csv$開催)))
受験者 <- as.numeric(gsub(",", "",gsub("人", "", FE_stats_csv$受験者)))
合格者 <- as.numeric(gsub(",", "",gsub("人", "", FE_stats_csv$合格者)))

FE_stats <- data.frame(開催 = 開催, 受験者 = 受験者, 合格者 = 合格者)

df <- data.frame(t = FE_stats$開催,success_rate = FE_stats$合格者 / FE_stats$受験者)
g <- ggplot(df, aes(x = t, y = success_rate, group = 1))+
    geom_line(colour = 'darkblue')+
    ylim(0.10, 0.40)
plot(g)

lgt <- function(p) {
    return(log(p/(1-p)))
}

invlgt <- function(x) {
    return(exp(x) / (1 + exp(x)))
}

lgt_suc_rat <- data.frame(t = FE_stats$開催, val = lgt(df$success_rate))
g <- ggplot(lgt_suc_rat, aes(x = t, y = val, group = 1))+
    geom_line(colour = 'darkorange')+
    ylim(-2.0, -0.0)
plot(g)

#autp correlation plot
lgt_suc_rat_acf <- acf(lgt_suc_rat$val, plot = FALSE)
acf_data <- data.frame(lag = lgt_suc_rat_acf$lag, acf = lgt_suc_rat_acf$acf)
acf_plot <- ggplot(acf_data, aes(x = lag, y = acf))+
    geom_hline(aes(yintercept = 0))+
    geom_segment(mapping = aes(xend = lag, yend = 0))
plot(acf_plot)
#Brown_motion_fitting###########################################################
#Brownian Motion
brownian_motion <- function(theta) {
    dlmModPoly(order = 1, dV = 0
               ,dW = exp(theta[1]), m0 = theta[2], C0 = exp(theta[3]))
}

fit_Brown_motion <- function(path, model) {
    
    fit <- dlmMLE(path, parm = rep(0, 3), build=model)
    
    llik <- - dlmLL(path, brownian_motion(fit$par))
    
    return(list(fit = fit, llik = llik))
}

fit.brown_motion <- fit_Brown_motion(lgt_suc_rat$val, brownian_motion)
mod.brown_motion <- brownian_motion(fit.brown_motion$fit$par)

#smoothing
smooth.brown_motion <- dlmSmooth(lgt_suc_rat$val, mod.brown_motion)

#forecast
T_Ahead <- 3
forecast <- dlmForecast(mod.brown_motion, nAhead = T_Ahead)

forecast.val <- append(dropFirst(smooth.brown_motion$s), forecast$a)
forecast.sd <- append(rep(0, 14), sqrt(as.numeric(forecast$R)))

#lower & upper bound of 90% C.I.
q <- qnorm(0.90)
upper_bd <- forecast.val + forecast.sd * q
lower_bd <- forecast.val - forecast.sd * q

df_forecast <- data.frame(t = seq(1, 17, length = 17)
                          , observed = append(lgt_suc_rat$val, forecast$a)
                          , val = forecast.val
                          , upper_CI = upper_bd
                          , lower_CI = lower_bd)

plot_forecast <- ggplot(df_forecast, aes(x = t)) + 
    geom_line(aes(y=val), colour="darkblue") + 
    geom_ribbon(aes(ymin=lower_CI, ymax=upper_CI), alpha=0.3)

plot(plot_forecast)

#inv_logit
df_forecast_sucrat <- data.frame(t = append(開催, c("H 31-04", "R 1-10", "R 1-10"))
                                 , sucrat = invlgt(forecast.val)
                                 , upper_CI = invlgt(upper_bd)
                                 , lower_CI = invlgt(lower_bd))

#次回(H 31 -04)合格率の予測値
df_forecast_sucrat$sucrat[15]
#0.2365265  

#19.4%~28%(0.90CI)
plot_forecast_sucrat <- ggplot(df_forecast_sucrat, aes(x = t, group = 1)) + 
    geom_line(aes(y=sucrat), colour="darkblue") + 
    geom_ribbon(aes(ymin=lower_CI, ymax=upper_CI), alpha=0.3)

plot(plot_forecast_sucrat)

平成最後の基本情報技術者試験の合格率推定結果は...
0.2365265 (= 23.6%)となりました.(ただ,90%Confidence Intervalは19.4%~28%とだいぶ幅がありますね.)以下は,推定結果のプロットです(灰色の部分は90%Confidence Interval).

f:id:kimigayoseishou:20190414214410p:plain
基本情報技術者試験合格率予測(3回先まで)

最後に

基本情報技術者試験を今回受ける方,頑張ってください╭( ・ㅂ・)و ̑̑ グッ

もうggらない{dplyr}

目次


  1. {dplyr}パッケージ
  2. 使用例(データフレーム)
    • 行抽出はfilter()
    • 集計関数はsummarise()
    • グループ化はgroup_by()
    • ソートはarrange()

{dplyr}パッケージ

Rパッケージ{dplyr}でデータ整形に使えるパッケージです.毎回ggるのが面倒なのでまとめてみます.github

https://github.com/tidyverse/dplyr も参照(ブラウザ上で公式チートシートからコピペしたい...).

使用例(データフレーム)

R標準で使えるデータセットirisを使います.散布図で様子を確認しましょう.

#散布図
>library('ggplot2')
>library('dplyr')
>plot<- iris %>% ggplot( aes(x = Sepal.Length, y = Sepal.Width, color = Species)) +
  geom_point()
>plot(plot)

f:id:kimigayoseishou:20190331111430p:plain
散布図

行抽出はfilter()

行の抽出を行うには,filter([dataframe], [condition])を使う.

#filterの中に条件式を書く
>setosa <- iris %>% 
  dplyr::filter(Species == 'setosa')
#species列がsetosaの行(50行)が抽出される

集計関数はsummarise()

集計を行うにはsummarise([dataframe], [max | min | mean ...])を使う.

#集計結果はlistで返される
>summary <-iris %>%
  dplyr::summarise(Sepal_length_max = max(Sepal.Length)
                   , Sepal_length_mim = min(Sepal.Length),
                   ,Sepal_length_mean = mean(Sepal.Length)
                   , Sepal_length_sd = sd(Sepal.Length)
                   )
>summary

結果は以下の通り.

Sepal_length_max Sepal_length_mim Sepal_length_mean Sepal_length_sd
1 7.9 4.3 5.843333 0.8280661

グループ化はgroup_by()

group_by([dataframe],[列名])で指定した列に関するグループ化ができる.

#Species列でグループ化
>summary_btw_spcies <- iris %>%
  dplyr::group_by(Species) %>%
  dplyr::summarise(Sepal_length_max = max(Sepal.Length)
                   , Sepal_length_mim = min(Sepal.Length)
                   , Sepal_length_mean = mean(Sepal.Length))
>summary_btw_spcies

結果は以下の通り.

Species Sepal_length_max Sepal_length_mim Sepal_length_mean
1 setosa 5.8 4.3 5.01
2 versicolor 7 4.9 5.94
3 virginica 7.9 4.9 6.59

ソートはarrange()

arrange([dataframe], [列名])で列名ソートができます.(デフォルトは昇順.)

#昇順ソート
iris_asc <- iris %>%
  dplyr::arrange(Sepal.Length)

#Sepal.Lengthが最も小さい3行
iris_asc %>% head(n = 3)

#降順ソート
iris_desc <- iris %>%
  dplyr::arrange(desc(Sepal.Length))

#Sepal.Lengthが最も大きい3行
iris_desc %>% head(n = 3)