【问题标题】:removing duplicate units from data frame从数据框中删除重复单元
【发布时间】:2013-03-07 12:27:31
【问题描述】:

我正在处理具有 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 的三个唯一组合。有没有办法在不编写函数的情况下实现这一点?

【问题讨论】:

    标签: r duplicates bigdata duplicate-removal


    【解决方案1】:

    您可以将data.frame 传递给duplicated

    在您的情况下,您希望传递 test 的前 3 列

     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

    【讨论】:

    【解决方案2】:

    谢谢!看起来我们可以做到:

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

    它也提供货物。所以,我们可以只使用列名而不是 1:3,顺序无关紧要

    【讨论】:

    • 这与我的回答没有什么不同,除了注意[ 的工作原理,这与duplicated 组件无关
    【解决方案3】:

    您可以使用dplyr 包中的distinct()

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

    或者没有%&gt;% 管道:

    distinct(test, UNIT, DATE, OUT1)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-02-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-03-23
      • 1970-01-01
      • 1970-01-01
      • 2012-01-04
      相关资源
      最近更新 更多