我正在研究一个包含n个协变量的大型数据集。许多行都是重复的。为了识别重复项,我需要使用协变量的子集来创建标识变量。也就是说,(n-x)协变量是无关紧要的。我想连接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.我尝试的解决方案是:
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),但该技术过于贪婪。新数据集应包含对单元1的三个观察结果,因为当UNIT = 1时,有三个UNIT + DATE + OUT1的唯一组合。有没有办法在不编写函数的情况下实现这一点?
答案 0 :(得分:10)
您可以将data.frame
传递给duplicated
在您的情况下,您希望传递test
test2 <- test[!duplicated(test[,1:3]),]
如果您正在使用大数据,并希望拥抱data.tables
,那么您可以将密钥设置为前三列(您要删除重复项),然后使用unique
library(data.table)
DT <- data.table(test)
# set the key
setkey(DT, UNIT,DATE,OUT1)
DTU <- unique(DT)
有关重复项和data.tables的详细信息,请参阅Filtering out duplicated/non-unique rows in data.table
答案 1 :(得分:0)
谢谢!看起来我们可以这样做:
test2 <- test[!duplicated(test[,c("OUT1","DATE","UNIT")]),]
它也提供货物。因此,我们可以使用列名而不是1:3,顺序无关紧要
答案 2 :(得分:0)
您可以使用dplyr包中的distinct()
:
library(dplyr)
test %>%
distinct(UNIT, DATE, OUT1)
或没有%>%
管道:
distinct(test, UNIT, DATE, OUT1)