重複データの処理プログラム例

Last modified: Oct 19, 2015

 同じ対象について,観察時間が異なる複数のデータが含まれている場合がある。そのような場合に,最新のデータ以外は削除するなどの事前処理が必要になることがある。


1 テストデータの生成

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 

2 プログラム例


2.1 プログラム 1

 以下のプログラムでは,重複のあるコードを持つデータは,最後に出現したデータを選択するようになる。

# 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 

2.2 プログラム 2

# 汎用性のある関数にする 
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 

2.3 プログラム 3

# 効率を上げる 
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