Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/75.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R 基于重复值对行进行分组_R - Fatal编程技术网

R 基于重复值对行进行分组

R 基于重复值对行进行分组,r,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

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

样本数据:

         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
我想做的是创建一个第四个变量,它将从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。我们可以从第七个元素(第一个元素)开始寻找更多的副本

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

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

temp此解决方案不会很快,但它可以工作

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 

    }

}

xdoes this help?进一步检查后,我发现这不起作用……例如。set.seed(19)-执行此过程后,值列不正确。我想知道你是否可以重复这个错误?是的,它在开始和找到重复项后都没有拾取第一行。我更改了“vec”的初始设置以说明这一点。现在可以用了吗?是的,很好-我想正是它-第一排-谢谢。当然可以。确保您同时选择了这两个编辑。我编辑了vec的初始设置,当我们在发现一个副本时重置,因为这是一个比我最初认为的更大的错误。。。