【问题标题】:Grouping rows based on duplicated values根据重复值对行进行分组
【发布时间】:2015-05-01 14:32:46
【问题描述】:

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

样本数据:

         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 开始并在观察时增加 1,只要重复来自 'id1' 或 'id2' 的值。每当一个值从上次增加时的观察开始重复时,它将再次增加 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,并且下一行的 next 更改,但一个作为“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

我不确定这会有多有效。

【问题讨论】:

标签: r


【解决方案1】:

此解决方案不会很快,但确实有效。

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 

    }

}

【讨论】:

  • 经过进一步审查,我发现这不起作用......例如set.seed(19) - 过程后值列不正确。我想知道你是否可以重复错误?
  • 是的,它在开始和找到重复后都没有拾取第一行。我改变了“vec”的初始设置来解决这个问题。现在可以用了吗?
  • 是的,太好了 - 我想就是这样 - 第一行 - 谢谢。
  • 当然可以。确保您选择了两个编辑。我编辑了 vec 的初始设置,当我们在找到重复项后重新设置时,因为这是一个比我最初想象的更大的错误......
猜你喜欢
  • 2014-09-03
  • 2019-11-20
  • 2021-07-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-10-28
  • 2019-02-12
相关资源
最近更新 更多