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

按行从两列中选择重复项,并在R中创建一个新变量

  •  0
  • Sara  · 技术社区  · 7 年前

    我有一个数据框,其中我有不同的ID和日期副本。我只想检测另一列中的一列的重复项,这样我就可以说: 1、删除T中id重复、日期重复且缺失的行(此表中的第二条记录)。 2、然后说:如果有重复的id和重复的日期,请选择T==“高”。

    id<-c("a", "a", "a", "a", "b", "c")
    datee<-c("12/02/10", "12/02/10", "12/02/10","10/03/11", "10/04/18","1/04/18" )
    T<-c("high", NA, "low","high", "low", "medium")
    mydata<-data.frame(id, datee, T)
    

    这是这样的:

    id    datee    T
    a 12/02/10    high
    a 12/02/10 <NA>
    a 12/02/10    low
    a 10/03/11    high
    b 10/04/18    low
    c 1/04/18     medium
    
    2 回复  |  直到 7 年前
        1
  •  0
  •   Terru_theTerror    7 年前

    逐步解决方案

    步骤1-删除缺失

    mydata<-mydata[!is.na(mydata[,3]),]
    

    步骤2-标识ID上的重复行

    dup_rows_ID<-duplicated(mydata[,c(1)],fromLast = TRUE) | duplicated(mydata[,c(1)],fromLast = FALSE)
    mydata_dup<-mydata[dup_rows_ID,]
    

    步骤3-标识ID和datee上重复的行

    dup_rows_ID_datee<-duplicated(mydata_dup[,c(1,2)],fromLast = TRUE) | duplicated(mydata_dup[,c(1,2)],fromLast = FALSE)
    

    步骤4-选择T=“高”

    mydata_dup2<-mydata_dup[mydata_dup[dup_rows_ID_datee,"T"]=="high",]
    

    您的输出

    rbind(mydata_dup[rownames(mydata_dup) %in% rownames(mydata_dup2),],
    +  mydata[!dup_rows_ID,])
      id    datee      T
    1  a 12/02/10   high
    4  a 10/03/11   high
    5  b 10/04/18    low
    6  c  1/04/18 medium
    

    关于ID==a如果有两个日期T==“high”,则必须选择日期较高还是较低的日期。

        2
  •  0
  •   Aleh    7 年前

    您可以先这样做:

    is_duplicate <- lapply(X = mydata, FUN = duplicated, incomparables = FALSE)
    is_na <- lapply(X = mydata, FUN = is.na)
    

    并使用数据。f.ex的帧。删除T中id重复、日期重复且缺少的行,如下所示:

    drop_idx <- which(is_duplicate$id & is_duplicate$datee & is_na$T)
    data[drop_idx, ]