【问题标题】:Duplicates for multiple variables in RR中多个变量的重复项
【发布时间】:2016-11-29 08:51:30
【问题描述】:

我有这段代码,我在其中加载了 CSV。这意味着删除具有相同值、字符、字符串等的重复行。在特定变量上,在本例中为 ID、DATE 和 Dx。

> alt
ID             RISK GENDER STATUS AGE DAY MONTH YEAR  DATE    SALA    Dx   DAY2  MONTH2 YEAR2  DATE2   Dx1     STATE1  
1  740010662    5      2      2   23  29    12  2009   40176   13   Z33.X    1      1   2010   40179  O82.9    please
2  347866388    5      2      1   23  31    12  2009   40178   13   O06.4    1      1   2010   40179  O06.4      help
3  705280124    5      2      2   33  31    12  2009   40178   13   Z33.X    1      1   2010   40179  O80.9        me
4  791125002    5      2      1   30  30    12  2009   40177   13   O33.5    1      1   2010   40179  O82.9       im 
5  469833092    5      2      1   26  31    12  2009   40178   13   Z33.X    1      1   2010   40179  O80.9    really
6  855318644    5      2      1   35  30    12  2009   40177   13   O47.9    1      1   2010   40179  O80.9   desperate
7  410886387    5      2      2   29  31    12  2009   40178   13   Z33.X    1      1   2010   40179  O80.9      been
8  486326736    5      2      1   37  30    12  2009   40177   13   O72.0    1      1   2010   40179  O82.9   banging
9  995190824    5      2      1   22   1     1  2010   40179   13   Z33.X    1      1   2010   40179  O80.9       my 
10 896565718    5      2      1   28  30    12  2009   40177   13   Z33.X    1      1   2010   40179  O82.9      head
11 347866388    5      2      1   23  31    12  2009   40178   13   O06.4    1      1   2010   40179  O06.4        to
12 855318644    5      2      1   35  30    12  2009   40177   13   O47.9    1      1   2010   40179  O80.9      the 
13 995190824    5      2      1   22   1     1  2010   40179   13   Z33.X    1      1   2010   40179  O80.9      wall

首先我加载了 csv

#1.Load database
BU<-read.csv(choose.files(),header = T,)
alt<- BU

后跟这段代码

# 2.eliminates duplicates according to multiple variables

# df1<-data frame with unique observations
# df2<-dataframe with duplicated observations

df1 <- alt[ !( duplicated(alt[,1]) & duplicated(alt[,9]) &  duplicated(alt[,11]) ), ]

df2 <- alt[ !(!( duplicated(alt[,1]) & duplicated(alt[,9]) & duplicated(alt[,11]) )), ]

瞧,它起作用了,这就是结果。

> df1
      ID       RISK GENDER STATUS AGE DAY MONTH YEAR  DATE   SALA    Dx     DAY2  MONTH2 YEAR2 DATE2   Dx1     STATE
1  740010662    5      2      2    23  29    12 2009  40176   13    Z33.X    1      1     2010 40179   O82.9    please
2  347866388    5      2      1    23  31    12 2009  40178   13    O06.4    1      1     2010 40179   O06.4      help
3  705280124    5      2      2    33  31    12 2009  40178   13    Z33.X    1      1     2010 40179   O80.9        me
4  791125002    5      2      1    30  30    12 2009  40177   13    O33.5    1      1     2010 40179   O82.9       im 
5  469833092    5      2      1    26  31    12 2009  40178   13    Z33.X    1      1     2010 40179   O80.9    really
6  855318644    5      2      1    35  30    12 2009  40177   13    O47.9    1      1     2010 40179   O80.9 desperate
7  410886387    5      2      2    29  31    12 2009  40178   13    Z33.X    1      1     2010 40179   O80.9      been
8  486326736    5      2      1    37  30    12 2009  40177   13    O72.0    1      1     2010 40179   O82.9   banging
9  995190824    5      2      1    22   1     1 2010  40179   13    Z33.X    1      1     2010 40179   O80.9       my 
10 896565718    5      2      1    28  30    12 2009  40177   13    Z33.X    1      1     2010 40179   O82.9      head
> df2
      ID       RISK GENDER STATUS AGE DAY MONTH YEAR  DATE   SALA    Dx    DAY2 MONTH2   YEAR2  DATE2    Dx1     STATE
11 347866388    5      2      1    23  31    12 2009 40178   13     O06.4    1      1      2010   40179    O06.4    to
12 855318644    5      2      1    35  30    12 2009 40177   13     O47.9    1      1      2010   40179    O80.9  the 
13 995190824    5      2      1    22   1     1 2010 40179   13     Z33.X    1      1      2010   40179    O80.9  wall

有效。因为它删除了第 11,12 和 13 行,它们是第 2,6 和 9 行的重复。

然而,原始数据库包含大约 18,000 个观察值和 27 个变量,并且代码失败。它似乎只根据一两个变量而不是三个变量 ID、DATE 和 Dx 来考虑重复。

【问题讨论】:

    标签: r dataframe duplicates multiple-columns


    【解决方案1】:

    我想你正在寻找

    alt[!duplicated(alt[c('ID','DATE','Dx')]),];
    

    当给定一个 data.frame 时,duplicated() 函数在决定哪些行是重复的时会考虑 data.frame 中的所有列。

    但请注意警告:

    数据框方法通过将由 \r 分隔的行的字符表示粘贴在一起来工作,因此如果数据框包含嵌入回车的字符或不能可靠地映射到字符的列,则可能不完美。


    回复您的评论:两者不等价。我的代码选择唯一行,而您的代码选择至少有一列的行,其单元格值不与列中的先前值重复。您的代码将无法选择每个单元格值单独与列中较高值重复的行,但其行整体上是对所有先前行的唯一行。

    这是一个简单的演示:

    g <- expand.grid(x=1:3,y=4:6)[rep(1:9,2L),];
    cbind(g,dennis=!duplicated(g$x) | !duplicated(g$y),bgoldst=!duplicated(g));
    ##     x y dennis bgoldst
    ## 1   1 4   TRUE    TRUE
    ## 2   2 4   TRUE    TRUE
    ## 3   3 4   TRUE    TRUE
    ## 4   1 5   TRUE    TRUE
    ## 5   2 5  FALSE    TRUE
    ## 6   3 5  FALSE    TRUE
    ## 7   1 6   TRUE    TRUE
    ## 8   2 6  FALSE    TRUE
    ## 9   3 6  FALSE    TRUE
    ## 1.1 1 4  FALSE   FALSE
    ## 2.1 2 4  FALSE   FALSE
    ## 3.1 3 4  FALSE   FALSE
    ## 4.1 1 5  FALSE   FALSE
    ## 5.1 2 5  FALSE   FALSE
    ## 6.1 3 5  FALSE   FALSE
    ## 7.1 1 6  FALSE   FALSE
    ## 8.1 2 6  FALSE   FALSE
    ## 9.1 3 6  FALSE   FALSE
    

    例如,请注意第一个不同的行 x=2 y=5 是如何被您的代码删除的,因为 x=2 是重复的,y=5 是重复的,但它包含在我的代码中,因为行 @完整的 987654328@ 与之前的所有行相比是唯一的。

    【讨论】:

    • 我知道 alt[!duplicated(alt[c('ID','DATE','Dx')]),]´ 相当于 alt[ !( duplicated(alt[,1]) &amp; duplicated(alt[,9]) &amp; duplicated(alt[,11]) ), ] ,但我担心它背后的逻辑,也许我缺乏知识是为什么在 18000 的 daframe 上使用 this 命令时观察结果和 28 个变量,它并没有找到所有变量的重复项。
    • @DennisAguilar 查看编辑。如果您有任何问题,请告诉我。
    • 我刚刚再次尝试使用 SPSS 和 Rstudio,效果很好。谢谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-06
    • 2021-02-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-21
    相关资源
    最近更新 更多