【问题标题】:Update first duplicate with entry from last duplicate record使用最后一个重复记录中的条目更新第一个重复项
【发布时间】:2023-03-05 17:31:01
【问题描述】:

我想使用最后一个副本的信息更新数据框中第一个副本(相对于标识符变量)的条目。在下面的数据中,我希望“begin_date”为该 ID 的最小值,“end_date”为该 ID 的最大值,同时只保留唯一的 ID 值。

改变这个:

data <- data.frame(id=c(1,1,1,2,2,3,3,3,4,4,4,4),begin_date=c(1970,1976,2000,1969,2010,1950,1986,1990,1960,1968,1972,1983),end_date=c(1976,2000,2012,2010,2013,1986,1990,1999,1968,1972,1983,2001))

到这里:

data <- data.frame(id=c(1,2,3,4),begin_date=c(1970,1969,1950,1960),end_date=c(2012,2013,1999,2001))

【问题讨论】:

    标签: r duplicates


    【解决方案1】:

    如果您将数据放在数据框中,那么您可以使用 plyr 的ddply

    library(plyr)
    data <- ddply(data, .(id), summarize, begin_date=min(begin_date), 
                  end_date=max(end_date))
    
    ##   id begin_date end_date
    ##1  1       1970     2012
    ##2  2       1969     2013
    ##3  3       1950     1999
    ##4  4       1960     2001
    

    【讨论】:

    • 谢谢你,这很完美! (我已经编辑了我的问题,以便创建一个 data.frame,哎呀)。
    【解决方案2】:

    你说它是一个data.frame,所以这就是我构建的:

    dat <- data.frame(id=c(1,1,1,2,2,3,3,3,4,4,4,4),
                      begin_date=c(1970,1976,2000,1969,2010,1950,1986,1990,1960, 1968,1972,1983),
                      end_date=c(1976,2000,2012,2010,2013,1986,1990,1999,1968, 1972,1983,2001))
    
    with( dat, data.frame(id=unique(id),  
                   begin_date =tapply(begin_date, id, head, 1),
                   end_date= tapply(end_date, id, tail,1) )
     )
    
      id begin_date end_date
    1  1       1970     2012
    2  2       1969     2013
    3  3       1950     1999
    4  4       1960     2001
    

    也可以使用最小值和最大值。

    【讨论】:

    • 感谢您的回答...我将使用 ddply 和 min/max,因为我觉得它更容易理解。
    猜你喜欢
    • 2011-07-14
    • 2019-07-12
    • 1970-01-01
    • 2022-01-13
    • 1970-01-01
    • 2016-02-14
    • 2018-11-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多