从数据框中删除重复单位

hub*_*rth 1 r duplicates duplicate-removal bigdata

我正在研究一个有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)
Run Code Online (Sandbox Code Playgroud)

'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    
Run Code Online (Sandbox Code Playgroud)

观察1和4在数据集中不重复.观察2和3是重复的.我想要创建的新数据集将保留观察1和4,并且只保留2和3中的一个.我尝试的解决方案是:

subset(test, !duplicated(c(UNIT,DATE,OUT1)))
Run Code Online (Sandbox Code Playgroud)

遗憾的是,这并不能解决问题:

      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
Run Code Online (Sandbox Code Playgroud)

虽然它确实忽略了无关的变量(JUNK1,JUNK2),但这种技术太贪婪了.新数据集应包含对单元1的三个观察结果,因为当UNIT = 1时,有三个UNIT + DATE + OUT1的唯一组合.有没有办法在不编写函数的情况下实现这一点?

mne*_*nel 10

你可以传递data.frame给duplicated

在您的情况下,您想要传递前3列 test

 test2 <- test[!duplicated(test[,1:3]),]
Run Code Online (Sandbox Code Playgroud)

如果您正在使用大数据,并希望拥抱data.tables,那么您可以将密钥设置为前三列(您要从中删除重复项),然后使用unique

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

有关重复项和data.tables的更多详细信息,请参阅过滤 data.table中的重复/非唯一行

  • 由于有一个`bigdata`标签,可能值得一提这篇关于从`data.table`中删除重复项的帖子 - http://stackoverflow.com/questions/11792527/filtering-out-duplicated-non-unique-rows-在数据表 (4认同)