代码之家  ›  专栏  ›  技术社区  ›  malasi

删除两对重复的大小写[重复]

  •  1
  • malasi  · 技术社区  · 6 年前

    我有一个结束日期不明确的数据集。因为我无法决定哪一个是正确的,所以我想将它们从数据帧中删除,但无法找出方法。

    以下是df示例:

    ID = as.integer(c(1,1,2,2,2,3,3,4,5,5,6,6))
    Feature = c("A","A","A","A","A","A","B","B","B","B","B","C")
    From = as.Date(c("2015-01-01","2015-01-01","2015-01-01","2015-01-01","2015-01-01","2015-01-01","2015-01-01","2015-01-01","2015-01-01","2016-01-01","2015-01-01","2015-01-01"))
    To = as.Date(c("2016-01-01", NA, "2015-01-01", "2016-01-01", "2017-01-01", "2016-01-01", "2017-01-01", "2016-01-01","2016-01-01","2017-01-01","2016-01-01","2016-01-01"))
    df = data.frame(ID, Feature, From, To)
    
    
    #which looks like this:
    
       ID Feature       From         To
    1   1       A 2015-01-01 2016-01-01
    2   1       A 2015-01-01       <NA>
    3   2       A 2015-01-01 2015-01-01
    4   2       A 2015-01-01 2016-01-01
    5   2       A 2015-01-01 2017-01-01
    6   3       A 2015-01-01 2016-01-01
    7   3       B 2015-01-01 2017-01-01
    8   4       B 2015-01-01 2016-01-01
    9   5       B 2015-01-01 2016-01-01
    10  5       B 2016-01-01 2017-01-01
    11  6       B 2015-01-01 2016-01-01
    12  6       C 2015-01-01 2016-01-01
    

    我想删除每个变量上重复的所有模糊情况,最后一个除外(ID 1和2就是这样的情况)。数据集中允许存在任何其他差异或重复性。

    编辑:也许,我应该指定Feature变量表示 劳动力市场上的某些不利因素(如残疾、, 单身父母、没有工作经验的年轻毕业生等)。那么一个 一个人可能有多个缺点,这些缺点可能发生在多个方面 《泰晤士报》。我编辑了原始样本df以考虑这种差异。

    我的理想样本df将保留以下情况:

       ID Feature       From         To
    6   3       A 2015-01-01 2016-01-01
    7   3       B 2015-01-01 2017-01-01
    8   4       B 2015-01-01 2016-01-01
    9   5       B 2015-01-01 2016-01-01
    10  5       B 2016-01-01 2017-01-01
    11  6       B 2015-01-01 2016-01-01
    12  6       C 2015-01-01 2016-01-01
    

    我一直在研究其他关于重复和不同功能的SO问题,但找不到类似的帖子。我认为我的问题与 this 因为我不在乎数据集中保留的案例(特征)数量,只要它们的日期不矛盾。Condradition是指一个特征被识别了两次,具有相同的开始日期,但是 不同的结束日期 。在这种情况下,我不知道该选择哪一个,所以我宁愿完全删除它们。

    我也一直在玩弄这些功能,例如:

    select = !duplicated(df[,1:3])
    df[select,]
    

    但无法找到一种方法来删除重复案例的两对,而不仅仅是第二对。 提前感谢您提供的任何提示!

    2 回复  |  直到 6 年前
        1
  •  1
  •   nya    6 年前

    实现删除所有重复行实例的一种方法是颠倒 duplicated 函数,它始终:

    返回第一个重复项x[i]的索引i

    使用此功能,我们可以组合正向和反向过程来删除包含重复数据的所有行。

    # first pass
    s1 = !duplicated(df[,1:3])
    # second pass on the data.frame with reversed order in each column
    s2 = !duplicated(apply(df[,1:3], 2, rev))
    # the second pass needs to be back-reversed to match the original df
    df[s1 & rev(s2), ]
       ID Feature       From         To
     5  3       A 2015-01-01 2016-01-01
     6  3       B 2015-01-01 2017-01-01
    

    或者我们可以使用@dalloliogm指出的更优雅的解决方案,并应用 复制的 带参数 fromLast = TRUE

    s2 = !duplicated(df[,1:3], fromLast = TRUE)
    df[s1 & s2, ]
    
        2
  •  1
  •   dalloliogm    6 年前

    我想删除每个 变量,除了最后一个(ID 1和2),但保留任何其他 差异类型,例如,如果ID具有多个特征(ID 3)。

    如果你能举一个较长的例子,那么回答你就会容易一些。我不清楚

    首先,确定哪些行具有更多“可变性”,例如,每个ID有多个特征:

    > library(tidyverse)
    > df %>% group_by(ID) %>% mutate(n_features=n_distinct(Feature))
    # A tibble: 6 x 5
    # Groups:   ID [3]
         ID Feature       From         To n_features
      <int>  <fctr>     <date>     <date>      <int>
    1     1       A 2015-01-01 2016-01-01          1
    2     1       A 2015-01-01         NA          1
    3     2       A 2015-01-01 2016-01-01          1
    4     2       A 2015-01-01 2017-01-01          1
    5     3       A 2015-01-01 2016-01-01          2
    6     3       B 2015-01-01 2017-01-01          2
    

    其次,删除所有重复的行,除了那些具有“可变性”的行:

    > df %>% 
           group_by(ID) %>% 
           mutate(n_features=n_distinct(Feature)) %>% 
           ungroup %>% 
           filter(
                   (!duplicated(Feature, From, To) | !duplicated(Feature, From, To, fromLast=T))| n_features>1)
    # A tibble: 2 x 5
         ID Feature       From         To n_features
      <int>  <fctr>     <date>     <date>      <int>
    1     3       A 2015-01-01 2016-01-01          2
    2     3       B 2015-01-01 2017-01-01          2