【问题标题】:How to delete duplicacy on certain conditions如何在某些条件下删除重复项
【发布时间】:2017-07-21 05:29:54
【问题描述】:

这是我尝试在不同数据集上执行的操作的示例,但仍然无法正常工作

PORT    STATUS   VESSEL         DWT      IMP/EXP    QTY (Mts)

1 KANDLA    SAILED  CAPTAIN HAMADA  7938 EXP   4500
2 KAKINADA  EXPECTED CELON BREEZE       IMP      30000
3  KAKINADA BERTH    CELON BREEZE       IMP     3000
4 KAKINADA  SAILED   CELON BREEZE       IMP     30000
5 KANDLA    ANCHORAGE CAPTAIN HAMADA    EXP  4500
6 KAKINADA  BERTH    CELON BREEZE       IMP     30000

我想将一行的 (PORT,VESSEL,IMP/EXP) 与另一行进行比较,如果匹配则删除,如果行中的 IMP/EXP 为“IMP”,然后按状态的优先顺序删除该行: 航行>泊位>锚地>预期 它将最高优先级sailed =status 和其他有锚地并删除第2 行,因为它与第4 行匹配的数量、港口、船只。 以此类推,如果条件匹配则查看

  1 ) status=sailed and other have berth ,it will delete berth row
  2) sailed and other have expected,it will delete expected row
   3)if some row have berth and other have anchorage will delete anchorage
  4)if some has expected=STATUS & other row have sailed=STATUS it will delete              

    "expected"=STATUS   row        

等等 行应符合条件,即qty,port,vessel根据条件删除行

对于 IMP/EXP 中的 EXP,它应该匹配条件,即数量、端口、容器
STATUS 中的优先条件:

     priority- sailed>anchorage>expected>  berth

输出应该是

PORT    STATUS   VESSEL              DWT    IMP/EXP QTY (Mts)

1 KANDLA    SAILED  CAPTAIN HAMADA  7938         EXP    4500
3  KAKINADA BERTH    CELON BREEZE             IMP      3000
4 KAKINADA  SAILED   CELON BREEZE             IMP      30000

第2、5、6行被删除是想要的输出

【问题讨论】:

  • 不会unique(hey) 得到输出
  • 从您的示例中,如果您想获得唯一的行,我会有点困惑?如果是,请尝试unique(hey)。否则,您能否指定要检查哪两列以查看它们在给定行中是否匹配?
  • 它是一个我不需要唯一的示例,您是否可以通过编辑代码以相同的方式解决问题,因为我的实际问题陈述使用不同的情况来删除使用此技术不起作用的行。 @萨尔
  • @RishabhKashyap - 那你想要什么?您的代码没有多大意义。我猜?duplicated 的某种组合会让你到达那里,但你必须更清楚你的删除标准。
  • 如果不查看具有完全代表性的样本数据,您的 cmets 没有任何意义。也让你的问题可以重现。

标签: r rstudio data-science data-science-experience


【解决方案1】:

首先,您需要在 data.frame 中将数据读入 R。 data.frame test 应该如下所示:

>test

#      PORT    STATUS         VESSEL  DWT IMPEXP   QTY
#1   KANDLA    SAILED CAPTAIN HAMADA 7938    EXP  4500
#2 KAKINADA  EXPECTED   CELON BREEZE   NA    IMP 30000
#3 KAKINADA     BERTH   CELON BREEZE   NA    IMP  3000
#4 KAKINADA    SAILED   CELON BREEZE   NA    IMP 30000
#5   KANDLA ANCHORAGE CAPTAIN HAMADA   NA    EXP  4500
#6 KAKINADA     BERTH   CELON BREEZE   NA    IMP 30000

使用 plyr 包的 ddply 函数,您应该能够在 tfollowing 函数的帮助下获得所需的输出。

ddply(test,.variables = c("PORT","VESSEL","IMPEXP","QTY"),
  function(t){if(t$IMPEXP[1]=="IMP"){
    t$STATUS<-factor(x = t$STATUS,levels =c("EXPECTED","ANCHORAGE","BERTH","SAILED"),ordered = T)
    return(t[which.max(as.integer(t$STATUS)),])
  }else{
    t$STATUS<-factor(x = t$STATUS,levels =c("BERTH","EXPECTED","ANCHORAGE","SAILED"),ordered = T)
    return(t[which.max(as.integer(t$STATUS)),])}
  }
)

#PORT STATUS         VESSEL  DWT IMPEXP   QTY
#1 KAKINADA  BERTH   CELON BREEZE   NA    IMP  3000
#2 KAKINADA SAILED   CELON BREEZE   NA    IMP 30000
#3   KANDLA SAILED CAPTAIN HAMADA 7938    EXP  4500

【讨论】:

  • 进口的顺序是不同的:航行>泊位>锚地>预期和出口:航行>锚地>预期>泊位还有一些其他的状态是随机字符串,我怎么能提到,这样它们就不会受到影响,因为它们会变成 NA,我需要这些字符串来输出,就像有: 航行锚地 预计泊位 船舶在外锚地 船舶在库图布迪亚的外锚地 船舶在锚地船舶未进入 我该怎么做才能使船舶在外锚地,在 KUTUBDIA 等的船只不受影响 bxoz 他们成为 NAs @Tushar
  • @RishabhKashyap 从基础开始。你应该先问这些问题。无论您遇到什么问题,一次解决一个问题,然后发布一个与这些问题相关的新问题。在开始处理数据之前,您需要先清理数据。
  • 先生刚刚询问如何避免 NAs 而没有提及存在的因素,应该显示 dat$STATUS
  • @RishabhKashyap :这就是我要说的,从基础开始。您应该看到 R 中的 factor 是什么。由于您的列 STATUS 有很多不同的字符串,您需要执行清理以减少 4 levels 的因子,仅像 BERTH,ANCHORAGE,SAILED,EXPECTED 或您的因子可以有更多levels 喜欢BERTH,ANCHORAGE,SAILED,EXPECTED,VESSEL AT OUTER ANCHORAGE。如果您不在factor 的级别中包含“VESSEL AT OUTER ANCHORAGE”,它将被转换为NA
  • @RishabhKashyap 另外,我已经根据 IMPEXP 值编辑了不同订单的答案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-12-17
  • 2013-02-24
  • 1970-01-01
  • 2020-02-13
  • 2019-04-21
  • 2015-06-23
  • 1970-01-01
相关资源
最近更新 更多