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的初始设置,当我们在发现一个副本时重置,因为这是一个比我最初认为的更大的错误。。。