R入門
データフレーム
最終更新:
r-intro
目次
データフレームを作成する
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
データフレームの連結(行の追加)
行の追加に相当するデータフレームの連結には、cbind関数を使う。連結するそれぞれのデータフレームは、フィールド数などが揃っていなければ連結することはできない。
> n1 <- c(2, 4, 6)
> n2 <- c(4, 16, 36)
> n3 <- c(3, 6, 9)
> n4 <- c(9, 36, 81)
> dtf1 <- data.frame(n1, n2)
> dtf1
n1 n2
1 2 4
2 4 16
3 6 36
> dtf2 <- data.frame(n3, n4)
> dtf2
n3 n4
1 3 9
2 6 36
3 9 81
> dtf <- cbind(dtf1, dtf2)
> dtf
n1 n2 n3 n4
1 2 4 3 9
2 4 16 6 36
3 6 36 9 81
データフレームに列を追加する
transform関数を使用する。追加する際には列の名前(等号記号の左側)を指定する必要があることに注意。
> no <- 1:3
> name <- c("A", "B", "C")
> dtf <- data.frame(no, name)
> print(dtf)
no name
1 1 A
2 2 B
3 3 C
> age <- c(20, 30, 40)
> dtf <- transform(dtf, age = age)
> print(dtf)
no name age
1 1 A 20
2 2 B 30
3 3 C 40
データフレームを行列に変換する
as.matrix関数を使う。ただ変換しただけでは列名が残ってしまう。列名を消すにはunname関数を使う。
以下のようなテキストファイルdata.txtがカレントディレクトリにあったとする。
1,165,53,86,56,92
2,160,47,84,52,92
3,166,55,86,64,89
4,164,56,90,60,95
5,168,55,87,56,87
6,164,54,87,57,92
7,168,54,94,58,97
8,169,55,88,57,92
9,169,53,86,58,93
10,166,56,84,57,90
> dtf <- read.csv("data.txt", header = FALSE)
> dtf
V1 V2 V3 V4 V5 V6
1 1 165 53 86 56 92
2 2 160 47 84 52 92
3 3 166 55 86 64 89
4 4 164 56 90 60 95
5 5 168 55 87 56 87
6 6 164 54 87 57 92
7 7 168 54 94 58 97
8 8 169 55 88 57 92
9 9 169 53 86 58 93
10 10 166 56 84 57 90
> mx <- as.matrix(dtf)
> mx
V1 V2 V3 V4 V5 V6
[1,] 1 165 53 86 56 92
[2,] 2 160 47 84 52 92
[3,] 3 166 55 86 64 89
[4,] 4 164 56 90 60 95
[5,] 5 168 55 87 56 87
[6,] 6 164 54 87 57 92
[7,] 7 168 54 94 58 97
[8,] 8 169 55 88 57 92
[9,] 9 169 53 86 58 93
[10,] 10 166 56 84 57 90
> mx <- unname(mx)
> mx
[,1] [,2] [,3] [,4] [,5] [,6]
[1,] 1 165 53 86 56 92
[2,] 2 160 47 84 52 92
[3,] 3 166 55 86 64 89
[4,] 4 164 56 90 60 95
[5,] 5 168 55 87 56 87
[6,] 6 164 54 87 57 92
[7,] 7 168 54 94 58 97
[8,] 8 169 55 88 57 92
[9,] 9 169 53 86 58 93
[10,] 10 166 56 84 57 90
データフレームから列の値が一致する行の行番号を得る
which関数を使う。以下、取得例。
> s <- c("h", "e", "l", "l", "o")
> n <- c(3, 1, 4, 1, 5)
> dtf <- data.frame(s, n)
> dtf
s n
1 h 3
2 e 1
3 l 4
4 l 1
5 o 5
> idx <- which(dtf$s == "e")
> idx
[1] 2
> idx <- which(dtf$s == "l")
> idx
[1] 3 4
> idx <- which(dtf$s == "l" & dtf$n == 1)
> idx
[1] 4
> idx <- which(dtf$s == "l" & dtf$n == 5)
> idx
integer(0)
検索対象の列を列名を指定したくない場合は、連番で指定する。
> idx <- which(dtf[, 1] == "l" & dtf[, 2] == 1)
> idx
[1] 4
データフレームを並び替える
[ ]演算子と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 い
データフレームから特定の列を削除する
[ ]演算子を使用して、削除したい列の列番号を、列番号指定箇所に負数で与える。
> 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
データフレームの行名をリセットする
データフレームを作成すると、自動的に行名が付けられる。
> 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
出納帳の残高をまとめて簡単に計算する
例えばデータフレームとして入金と出金の情報だけがあり、これらから残高を簡単に計算してデータフレームに列として追加してみる。
データフレーム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