« 2024年10月 | トップページ | 2024年12月 »

2024年11月29日 (金)

[R]出納帳の残高をまとめて簡単に計算する

例えばデータフレームとして入金と出金の情報だけがあり、これらから残高を簡単に計算してデータフレームに列として追加してみる。

データフレームdtfに以下のような情報がある状態で、残高を簡単に計算して列に追加してみる。累積の和を計算するには、cumsum関数を使えばよい。

> dtf
年月日 内容 入 出
1 2024-07-25 入金 100000 0
2 2024-08-02 電気 0 4000
3 2024-08-04 ガス 0 3000
4 2024-08-04 水道 0 2000
5 2024-08-25 入金 120000 0
6 2024-09-03 電気 0 5000
7 2024-09-03 ガス 0 4000
> 残高 <- dtf$入 - dtf$出
> 残高 <- cumsum(残高)
> dtf1 <- cbind(dtf, 残 = 残高)
> dtf1
年月日 内容 入 出 残
1 2024-07-25 入金 100000 0 100000
2 2024-08-02 電気 0 4000 96000
3 2024-08-04 ガス 0 3000 93000
4 2024-08-04 水道 0 2000 91000
5 2024-08-25 入金 120000 0 211000
6 2024-09-03 電気 0 5000 206000
7 2024-09-03 ガス 0 4000 202000

上の例では、残高を最初は0円ということで計算したが、これを例えば元々20万円あったとして残高を求める場合は、以下のようにすればよい。

> dtf2 <- cbind(dtf, 残 = 残高 + 200000)
> dtf2
年月日 内容 入 出 残
1 2024-07-25 入金 100000 0 300000
2 2024-08-02 電気 0 4000 296000
3 2024-08-04 ガス 0 3000 293000
4 2024-08-04 水道 0 2000 291000
5 2024-08-25 入金 120000 0 411000
6 2024-09-03 電気 0 5000 406000
7 2024-09-03 ガス 0 4000 402000

2024年11月28日 (木)

[R]ベクトルの要素について累積の積を求める

ベクトルの要素の値をインデックス順に掛けた累積の値を得るには、cumprod関数を使う。順番に要素を掛けるだけのため、最後の例のように要素の値をすべて同じにすれば、単純に累乗が求まることになる。

> i <- 1:5
> i
[1] 1 2 3 4 5
> cumprod(i)
[1] 1 2 6 24 120
> i <- rep(2, 8)
> i
[1] 2 2 2 2 2 2 2 2
> cumprod(i)
[1] 2 4 8 16 32 64 128 256

2024年11月27日 (水)

[R]ベクトルの要素について累積の和を求める

ベクトルの要素の値をインデックス順に足した累積の値を得るには、cumsum関数を使う。

> i <- 1:10
> i
[1] 1 2 3 4 5 6 7 8 9 10
> cumsum(i)
[1] 1 3 6 10 15 21 28 36 45 55

2024年11月26日 (火)

[R]tibbleで特定の列の値を基準にして集計を行う

例えば家計簿のように、日にちと金額が一対一で対応しているデータについて、毎日の入出金の流れを見たい場合など。

各情報の基準は日にちであり、同じ日にいくつも入金や出金が発生する日があり、この基準となる日付には重複がある。このようなデータを一覧で見るぶんにはよいが、毎日の入出金の流れはこれでは見ることはできない。この例では、日ごとに金額の集計を行いたい。この場合は、日にちごとの金額の和を計算してまとめたい。

このような場合は、group_by関数でtibble内部でグループ化を行い、それをsummarize関数で処理することで、集計後のtibbleに変換することができる。以下、実行例。表示を簡潔にするため、データフレームに変換して表示している。

> tib %>% as.data.frame()
date type value
1 2023-10-03 入金 200
2 2023-10-04 電気 4
3 2023-10-07 ガス 5
4 2023-10-07 電話 7
5 2023-10-09 水道 6
> tib %>% group_by(date) %>% as.data.frame()
date type value
1 2023-10-03 入金 200
2 2023-10-04 電気 4
3 2023-10-07 ガス 5
4 2023-10-07 電話 7
5 2023-10-09 水道 6
> tib %>% group_by(date) %>% summarize(value = sum(value)) %>% as.data.frame()
date value
1 2023-10-03 200
2 2023-10-04 4
3 2023-10-07 12
4 2023-10-09 6

group_by関数は内部でグループ化を行っているだけであり、2番目の実行例のとおりgroup_by関数だけでは集計が行われない(表示されない)ことに注意。

2024年11月25日 (月)

[R]read_xlsx関数を使うと画面表示が乱れる(カーソルが飛ぶ)

readxlパッケージのread_xlsx関数は、デフォルトでは、読み込み時に実際は表示されないものの経過を画面表示しようとするため、その影響で、使用後は画面表示が乱れ、カーソルがおかしなところに飛んでしまう。この画面表示の乱れが起きないようにするには、progressオプションにFALSEを指定する。

> library(readxl)
> tib <- read_xlsx("sample.xlsx")

←カーソルがコマンドラインのプロンプトから離れた箇所に表示され、表示が乱れる。

一度Rを終了し、再起動して次のコマンドを実行する。

> library(readxl)
> tib <- read_xlsx("sample.xlsx", progress = FALSE)

←カーソルがコマンドラインのプロンプトのすぐ右側に表示され、表示が乱れない。

以下を.RProfileに記述しておけば、R起動時に自動的に読み込み、デフォルトでそのような設定になる。

options(
readxl.show_progress = FALSE
)

R起動後でも、以下のコマンドを実行すれば同じようにデフォルトでそのような設定になる。

options(readxl.show_progress = FALSE)

2024年11月24日 (日)

[R]松井秀喜の大リーグでの年間打撃成績を調べる

Lahmanデータベースを使うと簡単に調べることができる。

> library(tidyverse)
> library(Lahman)
> plid <- (People %>% filter(nameFirst == "Hideki" & nameLast == "Matsui"))$playerID
> Batting %>% group_by(playerID) %>% filter(playerID == plid) %>%
+ select(playerID, yearID, teamID, lgID, G, AB, H) %>%
+ as.data.frame()
playerID yearID teamID lgID G AB H
1 matsuhi01 2003 NYA AL 163 623 179
2 matsuhi01 2004 NYA AL 162 584 174
3 matsuhi01 2005 NYA AL 162 629 192
4 matsuhi01 2006 NYA AL 51 172 52
5 matsuhi01 2007 NYA AL 143 547 156
6 matsuhi01 2008 NYA AL 93 337 99
7 matsuhi01 2009 NYA AL 142 456 125
8 matsuhi01 2010 LAA AL 145 482 132
9 matsuhi01 2011 OAK AL 141 517 130
10 matsuhi01 2012 TBA AL 34 95 14

2024年11月23日 (土)

[R]イチローの大リーグでの年間打撃成績を調べる

Lahmanデータベースを使うと簡単に調べることができる。

> library(tidyverse)
> library(Lahman)
> plid <- (People %>% filter(nameFirst == "Ichiro"))$playerID
> Batting %>% group_by(playerID) %>% filter(playerID == plid) %>%
+ select(playerID, yearID, teamID, lgID, G, AB, H) %>%
+ as.data.frame()
playerID yearID teamID lgID G AB H
1 suzukic01 2001 SEA AL 157 692 242
2 suzukic01 2002 SEA AL 157 647 208
3 suzukic01 2003 SEA AL 159 679 212
4 suzukic01 2004 SEA AL 161 704 262
5 suzukic01 2005 SEA AL 162 679 206
6 suzukic01 2006 SEA AL 161 695 224
7 suzukic01 2007 SEA AL 161 678 238
8 suzukic01 2008 SEA AL 162 686 213
9 suzukic01 2009 SEA AL 146 639 225
10 suzukic01 2010 SEA AL 162 680 214
11 suzukic01 2011 SEA AL 161 677 184
12 suzukic01 2012 SEA AL 95 402 105
13 suzukic01 2012 NYA AL 67 227 73
14 suzukic01 2013 NYA AL 150 520 136
15 suzukic01 2014 NYA AL 143 359 102
16 suzukic01 2015 MIA NL 153 398 91
17 suzukic01 2016 MIA NL 143 327 95
18 suzukic01 2017 MIA NL 136 196 50
19 suzukic01 2018 SEA AL 15 44 9
20 suzukic01 2019 SEA AL 2 5 0

2012年のシーズンは、シーズン途中でマリナーズからヤンキースに移籍しているのでレコードが二つあることに注意。Gは出場試合数。ABは打席数。Hは安打数。

2024年11月22日 (金)

[R]MLBの投手の通算勝利数の20位までを調べる

Lahmanデータベースを使うと簡単に調べることができる。

> library(Lahman)
> library(tidyverse)
> tib <- Pitching %>% group_by(playerID) %>%
+ summarize(W = sum(W)) %>%
+ left_join(People, by = "playerID") %>%
+ select(nameFirst, nameLast, W)
> tib %>% arrange(desc(W)) %>%
+ as.data.frame() %>% head(20)
nameFirst nameLast W
1 Cy Young 511
2 Walter Johnson 417
3 Pete Alexander 373
4 Christy Mathewson 373
5 Pud Galvin 365
6 Warren Spahn 363
7 Kid Nichols 362
8 Greg Maddux 355
9 Roger Clemens 354
10 Tim Keefe 342
11 Steve Carlton 329
12 John Clarkson 328
13 Eddie Plank 326
14 Nolan Ryan 324
15 Don Sutton 324
16 Phil Niekro 318
17 Gaylord Perry 314
18 Tom Seaver 311
19 Old Hoss Radbourn 310
20 Mickey Welch 307

投手の通算勝利数の一位はサイ・ヤングの511勝、二位はウォルター・ジョンソンの417勝、三位はピート・アレクサンダーの373勝であることがわかる。参考までに、野茂英雄は以下のとおり123勝。

> tib %>% filter(nameLast == "Nomo") %>% as.data.frame()
nameFirst nameLast W
1 Hideo Nomo 123

2024年11月20日 (水)

[R]MLBの通算二塁打数の20位までを調べる

Lahmanデータベースを使うと簡単に調べることができる。

> library(Lahman)
> library(tidyverse)
> Batting %>% group_by(playerID) %>% summarize(X2B = sum(X2B)) %>%
+ left_join(People, by = "playerID") %>%
+ select(nameFirst, nameLast, X2B) %>% arrange(desc(X2B)) %>%
+ as.data.frame() %>% head(20)
nameFirst nameLast X2B
1 Tris Speaker 792
2 Pete Rose 746
3 Stan Musial 725
4 Ty Cobb 724
5 Albert Pujols 686
6 Craig Biggio 668
7 George Brett 665
8 Nap Lajoie 657
9 Carl Yastrzemski 646
10 Honus Wagner 643
11 Adrian Beltre 636
12 David Ortiz 632
13 Hank Aaron 624
14 Miguel Cabrera 607
15 Paul Molitor 605
16 Paul Waner 605
17 Cal Ripken 603
18 Barry Bonds 601
19 Luis Gonzalez 596
20 Todd Helton 592

通算通算二塁打数の一位はトリス・スピーカーの792本、二位はピート・ローズの746本、三位はスタン・ミュージアルの725本であることがわかる。参考までに、イチローは以下のとおり362本。

> Batting %>% group_by(playerID) %>% summarize(X2B = sum(X2B)) %>%
+ left_join(People, by = "playerID") %>%
+ select(nameFirst, nameLast, X2B) %>% filter(nameFirst == "Ichiro") %>%
+ as.data.frame()
nameFirst nameLast X2B
1 Ichiro Suzuki 362

2024年11月 6日 (水)

[R]MLBの通算安打数の20位までを調べる

Lahmanデータベースを使うと簡単に調べることができる。

> library(Lahman)
> library(tidyverse)
> Batting %>% group_by(playerID) %>% summarize(H = sum(H)) %>%
+ left_join(People, by = "playerID") %>%
+ select(nameFirst, nameLast, H) %>% arrange(desc(H)) %>%
+ as.data.frame() %>% head(20)
nameFirst nameLast H
1 Pete Rose 4256
2 Ty Cobb 4189
3 Hank Aaron 3771
4 Stan Musial 3630
5 Tris Speaker 3514
6 Derek Jeter 3465
7 Cap Anson 3435
8 Honus Wagner 3420
9 Carl Yastrzemski 3419
10 Albert Pujols 3384
11 Paul Molitor 3319
12 Eddie Collins 3315
13 Willie Mays 3283
14 Eddie Murray 3255
15 Nap Lajoie 3243
16 Cal Ripken 3184
17 Adrian Beltre 3166
18 George Brett 3154
19 Paul Waner 3152
20 Robin Yount 3142

通算安打数の一位はピート・ローズの4256本、二位はタイ・カッブの4189本、三位はハンク・アーロンの3771本であることがわかる。参考までに、イチローは以下のとおり3089本。

> Batting %>% group_by(playerID) %>% summarize(H = sum(H)) %>%
+ left_join(People, by = "playerID") %>%
+ select(nameFirst, nameLast, H) %>% filter(nameFirst == "Ichiro") %>%
+ as.data.frame()
nameFirst nameLast H
1 Ichiro Suzuki 3089

« 2024年10月 | トップページ | 2024年12月 »

無料ブログはココログ

■■

■■■