1

n 個の共変量を持つ大規模なデータセットに取り組んでいます。行の多くは重複しています。重複を識別するために、共変量のサブセットを使用して識別変数を作成する必要があります。つまり、(nx) 共変量は無関係です。x共変量の値を連結して、観測を一意に識別し、重複を排除したいと考えています。

set.seed(1234)
UNIT <- c(1,1,1,1,2,2,2,3,3,3,4,4,4,5,6,6,6)
DATE <- c("1/1/2010","1/1/2010","1/1/2010","1/2/2012","1/2/2009","1/2/2004","1/2/2005","1/2/2005",
      "1/1/2011","1/1/2011","1/1/2011","1/1/2009","1/1/2008","1/1/2008","1/1/2012","1/1/2013",
      "1/1/2012")
OUT1 <- c(300,400,400,400,600,700,700,800,800,800,900,700,700,100,100,100,500)
JUNK1 <- c(rnorm(17,0,1))
JUNK2 <- c(rnorm(17,0,1))

test = data.frame(UNIT,DATE,OUT1,JUNK1,JUNK2)

「test」はサンプル データ フレームです。観測を一意に識別するために使用する必要がある変数は、「UNIT」、「DATE」、および「OUT1」です。例えば、

head(test)
  UNIT     DATE OUT1      JUNK1      JUNK2
1    1 1/1/2010  300 -1.2070657 -0.9111954
2    1 1/1/2010  400  0.2774292 -0.8371717
3    1 1/1/2010  400  1.0844412  2.4158352
4    1 1/2/2012  400 -2.3456977  0.1340882
5    2 1/2/2009  600  0.4291247 -0.4906859
6    2 1/2/2004  700  0.5060559 -0.4405479    

観察 1 と 4 は、データセット内で重複していません。観察 2 と 3 は重複しています。私が作成したい新しいデータセットは、観察 1 と 4 を保持し、2 と 3 の1 つだけを保持します。私が試した解決策は次のとおりです。

subset(test, !duplicated(c(UNIT,DATE,OUT1)))

残念ながら、これはうまくいきません:

      UNIT     DATE OUT1       JUNK1      JUNK2
1        1 1/1/2010  300 -1.20706575 -0.9111954
5        2 1/2/2009  600  0.42912469 -0.4906859
8        3 1/2/2005  800 -0.54663186 -0.6937202
11       4 1/1/2011  900 -0.47719270 -1.0236557
14       5 1/1/2008  100  0.06445882  1.1022975
15       6 1/1/2012  100  0.95949406 -0.4755931

無関係な変数 (JUNK1、JUNK2) は無視されますが、この手法は貪欲すぎます。UNIT = 1 の場合、UNIT + DATE + OUT1 の一意の組み合わせが 3 つあるため、新しいデータセットにはユニット 1 に 3 つの観測が含まれている必要があります。関数を記述せずにこれを達成する方法はありますか?

4

3 に答える 3

10

に渡すことができdata.frameますduplicated

あなたの場合、最初の3列を渡したいtest

 test2 <- test[!duplicated(test[,1:3]),]

ビッグデータを使用していて、 を採用したいdata.tables場合は、キーを最初の 3 つの列 (重複を削除したい列) に設定してから、unique

library(data.table)
DT <- data.table(test)
# set the key
setkey(DT, UNIT,DATE,OUT1)
DTU <- unique(DT)

重複と data.tables の詳細については、「data.table 内の重複した/一意でない行を除外する」を参照してください。

于 2013-03-19T00:03:41.523 に答える
0

dplyrパッケージdistinct()から使用できます。

library(dplyr)
test %>%
  distinct(UNIT, DATE, OUT1)

または%>%パイプなし:

distinct(test, UNIT, DATE, OUT1)
于 2015-05-29T01:18:49.887 に答える
0

ありがとう!できるようです:

test2 <- test[!duplicated(test[,c("OUT1","DATE","UNIT")]),]

商品も配達します。したがって、1:3 ではなく列名を使用でき、順序は関係ありません。

于 2013-03-19T01:35:07.527 に答える