R(データフレーム)

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

2023年6月 2日 (金)

[R]データフレームの行名をリセットする

データフレームを作成すると、自動的に行名が付けられる。

> no <- c(2, 4, 1, 5, 3)
> name <- c("A", "B", "C", "D", "E")
> dtf <- data.frame(no, name)
> dtf
no name
1 2 A
2 4 B
3 1 C
4 5 D
5 3 E

上の左端の数字のとおりに、データフレーム作成時に、最初から順番に1~5の番号が強制的に割り振られる。このデータフレームを、例えばソートすると以下のようになる。

> dtf2 <- dtf[order(dtf$no), ]
> dtf2
no name
3 1 C
1 2 A
5 3 E
2 4 B
4 5 D

3,1,5,2,4とソート前に割り振られた番号(行名)がそのまま付いたままになる。この行名を消すにはrownames関数を使う。NULLを与えると行名はすべて消される(最初から順番に1~の番号が割り当てられる)。

> rownames(dtf2) <- NULL
> dtf2
no name
1 1 C
2 2 A
3 3 E
4 4 B
5 5 D

例えば、以下のようなこともできる。

> rownames(dtf2) <- 5:1
> dtf2
no name
5 1 C
4 2 A
3 3 E
2 4 B
1 5 D

2023年4月25日 (火)

[R]データフレームから特定の列を削除する

[ ]演算子を使用して、削除したい列の列番号を、列番号指定箇所に負数で与える。

> no <- 1:3
> name <- c("A", "B", "C")
> age <- c(20, 30, 40)
> blood <- c("AB", "B", "AB")
> dtf1 <- data.frame(no, name, age, blood)
> print(dtf1)
no name age blood
1 1 A 20 AB
2 2 B 30 B
3 3 C 40 AB
> dtf2 <- dtf1[, -c(2, 3)]
> print(dtf2)
no blood
1 1 AB
2 2 B
3 3 AB

2022年8月 3日 (水)

[R]データフレームを並び替える

[ ]演算子とorder関数を組み合わせて使う。2つ以上の値で並び替える場合は、order関数にその並び替える順番に列を指定する。order関数による並び替えはデフォルトで昇順に並び替えられるが、これを降順にするのであればorder関数のdecreasingオプションにTRUEを与える。

> n <- c(3, 3, 1, 2)
> s1 <- c("ABC", "123", "123", "abc")
> s2 <- c("え", "う", "い", "あ")
> dtf <- data.frame(n, s1, s2)
> print(dtf)
n s1 s2
1 3 ABC え
2 3 123 う
3 1 123 い
4 2 abc あ
> print(dtf[order(dtf$n), ])
n s1 s2
3 1 123 い
4 2 abc あ
1 3 ABC え
2 3 123 う
> print(dtf[order(dtf$n, dtf$s2), ])
n s1 s2
3 1 123 い
4 2 abc あ
2 3 123 う
1 3 ABC え
> print(dtf[order(dtf$n, decreasing = TRUE), ])
n s1 s2
1 3 ABC え
2 3 123 う
4 2 abc あ
3 1 123 い

2022年8月 2日 (火)

[R]データフレームを作成する

data.frame関数を使う。

> no <- 1:3
> n <- 1:3
> s <- c("田中", "山本", "林")
> dt <- as.Date(c("2001-01-01", "2002-08-31", "1999-12-29"))
> dtf <- data.frame(n, s, dt)
> print(dtf)
n s dt
1 1 田中 2001-01-01
2 2 山本 2002-08-31
3 3 林 1999-12-29

2017年5月23日 (火)

[R]指定の列の値でデータフレームをソートする

order関数を使う。order関数は並び替えられたインデックスを返すので、並び替えられたデータフレームを作成するには、元のデータフレームにその戻り値のインデックスを指定すればよい。

以下は、3行2列のデータフレームを、2列目の数値でソートした例。order関数はデフォルトでは昇順にソートする。これを降順にしたいのであれば、decreasingオプションをTRUEにする必要がある。

> dtf <- data.frame(V1 = c("A", "B", "C"), V2 = c(1, 3, 2))
> dtf
  V1 V2
1  A  1
2  B  3
3  C  2
> order(dtf$V2)
[1] 1 3 2
> order(dtf$V2, decreasing = TRUE)
[1] 2 3 1
> dtf[order(dtf$V2), ]
  V1 V2
1  A  1
3  C  2
2  B  3

2017年4月28日 (金)

[R]データフレームを縦方向に連結する

同じデータフレームを縦方向に連結する方法(一方のデータフレームに行を追加するイメージ)。rbind関数を使えばよい。以下、例。

> (x <- data.frame(a = 1:3, b = c("A", "B", "C")))
  a b
1 1 A
2 2 B
3 3 C
> (y <- data.frame(a = 5:6, b = c("D", "E")))
  a b
1 5 D
2 6 E
> rbind(x, y)
  a b
1 1 A
2 2 B
3 3 C
4 5 D
5 6 E

当然、連結するそれぞれのデータフレームの桁の名前や型がそろっていなければならない。

無料ブログはココログ

■■

■■■