出于某种原因,我对这个特殊问题有一个盲点。
示例数据:
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
我不确定这会有多有效。
答案 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
}
}