根据重复值对行进行分组

时间:2015-03-01 02:38:08

标签: r

出于某种原因,我对这个特殊问题有一个盲点。

示例数据:

         date id1 id2
   1888-09-08   A   E
   1888-09-15   B   M
   1888-09-22   C   L
   1888-09-22   D   B
   1888-09-29   A   R
   1888-10-27   F   G
   1888-11-17   J   H
   1888-11-17   E   O
   1888-11-24   H   F
   1888-12-15   G   L
   1889-01-19   K   G
   1889-02-09   M   E

我想要做的是创建一个第4个变量,从1开始,每当“id1”或“id2”的值重复时,在观察时增加1。每当从上次增加的观察开始重复一个值时,它将再次增加1。

预期结果:

         date id1 id2 value
   1888-09-08   A   E     1
   1888-09-15   B   M     1
   1888-09-22   C   L     1
   1888-09-22   D   B     2
   1888-09-29   A   R     2
   1888-10-27   F   G     2
   1888-11-17   J   H     2
   1888-11-17   E   O     2
   1888-11-24   H   F     3
   1888-12-15   G   L     3
   1889-01-19   K   G     4
   1889-02-09   M   E     4

如您所见,在第四行,ID“B”重复,如之前所见。因此,值变量增加到'2'。从这一行开始,我们然后搜索下一个重复的'id'。这发生在第9行,其中“H”重复(自上次'值'变化以来在先前的观察中已经看到过)。然后,该值将更改为3,下一行将更改为“G”重复。

我希望这是有道理的。

我没有走得太远。我的主要想法是将两列转换为长向量,然后找到第一个重复的值。由此,我们可以得出所有属于不同行的元素都会得到'1',而这个元素'8'和它的伙伴'7'会得到2.我们可以从第7个元素(第一个元素)开始对)前进寻找更多重复...

temp <- as.matrix(c(rbind(as.character(dfr[,2]), as.character(dfr[,3])))) #put two columns into single vector

min(which(duplicated(temp))) #8

我不确定这会有多有效。

1 个答案:

答案 0 :(得分:2)

这个解决方案不会很快但是有效。

x<-sample(LETTERS[1:5],40,replace=TRUE)
y<-sample(LETTERS[1:5],40,replace=TRUE)
df<-data.frame(x=x,y=y,value=1)
df$x<-as.character(df$x)
df$y<-as.character(df$y)

vec<-c(df[1,c('x','y')])
for(i in 2:nrow(df)){

    if(df[i,'x'] %in% vec | df[i,'y'] %in% vec) {  #checking whether in vector

        print('in') #printing when duplicates are found
        df[i,'value']=df[i-1,'value']+1 #adding to the value
        vec<-c(df[i,c('x','y')]) #resetting the vector

    } else {

        df[i,'value']=df[i-1,'value'] 
        vec<-c(vec,df[i,c('x','y')])   #if not found i add to the vector 

    }

}