同じ対象について,観察時間が異なる複数のデータが含まれている場合がある。そのような場合に,最新のデータ以外は削除するなどの事前処理が必要になることがある。
set.seed(12345) d <- data.frame(code=sample(10, 12, replace=TRUE), value=rnorm(12)) d
## code value ## 1 8 0.6300986 ## 2 9 -0.2761841 ## 3 8 -0.2841597 ## 4 9 -0.9193220 ## 5 5 -0.1162478 ## 6 2 1.8173120 ## 7 4 0.3706279 ## 8 6 0.5202165 ## 9 8 -0.7505320 ## 10 10 0.8168998 ## 11 1 -0.8863575 ## 12 2 -0.3315776
以下のプログラムでは,重複のあるコードを持つデータは,最後に出現したデータを選択するようになる。
# for ループで重複コードを探し,マークしておく方法 nr <- nrow(d) ok <- rep(TRUE, nr) for (i in 1 : (nr-1)) { for (j in (i+1) : nr) { if (d$code[i] == d$code[j]) { ok[i] <- FALSE break } } } (d2 <- d[ok,])
## code value ## 4 9 -0.9193220 ## 5 5 -0.1162478 ## 7 4 0.3706279 ## 8 6 0.5202165 ## 9 8 -0.7505320 ## 10 10 0.8168998 ## 11 1 -0.8863575 ## 12 2 -0.3315776
# 汎用性のある関数にする unique2 <- function(d, code) { # コードが,d の code 列にあるとする nr <- nrow(d) ok <- rep(TRUE, nr) for (i in 1 : (nr-1)) { for (j in (i+1) : nr) { if (d[i, code] == d[j, code]) { ok[i] <- FALSE break } } } d[ok,] } (d3 <- unique2(d, 1))
## code value ## 4 9 -0.9193220 ## 5 5 -0.1162478 ## 7 4 0.3706279 ## 8 6 0.5202165 ## 9 8 -0.7505320 ## 10 10 0.8168998 ## 11 1 -0.8863575 ## 12 2 -0.3315776
# 効率を上げる unique3 <- function(d, code) { nr <- nrow(d) ok <- rep(TRUE, nr) for (i in 1 : (nr-1)) { if (sum(d[(i+1) : nr, code] %in% d[i, code])) { ok[i] <- FALSE } } d[ok,] } (d4 <- unique3(d, 1))
## code value ## 4 9 -0.9193220 ## 5 5 -0.1162478 ## 7 4 0.3706279 ## 8 6 0.5202165 ## 9 8 -0.7505320 ## 10 10 0.8168998 ## 11 1 -0.8863575 ## 12 2 -0.3315776