我在R中有以下数据框

  ID     bay    row    tier
  1       1      2      80
  2       3      2      80
  3       2      5      06
  4       4      5      06
  5       23     6      82
  6       25     6      82
  7       24     6      82
  8       4      12     08

我想找到的是rowtier值相等,并且同时bay应该是odd数字,并且两个相同row and tier条目之间的间隔差应该是2

例如
 ID     bay    row    tier
 1       1      2      80
 2       3      2      80

上面两行表明我的条件row and tierbay相同,因为奇数,并且two bay numebers之间的差异是2,我需要生成一个将为两行生成的标志,可以说1,2,3唯一地标识了这对

我想要的数据框是
 ID     bay    row    tier   flag
 1       1      2      80     1
 2       3      2      80     1
 3       2      5      06     NA
 4       4      5      06     NA
 5       23     6      82     2
 6       25     6      82     2
 7       24     6      82     NA
 8       4      12     08     NA

我如何在R中做到这一点?

最佳答案

您可以按以下方式获取子集,

ind <- duplicated(df[c('row', 'tier')]) & df$bay%%2 == 1|
       duplicated(df[c('row', 'tier')], fromLast = TRUE) & df$bay%%2 == 1
df1 <- df[ind,]
df1 <- df1[!!with(df1, ave(bay, new, FUN = function(i) c(TRUE, diff(i) == 2))),]
df1

这使



要获得标志,
df$flag <- cumsum(c(1, diff(which(ind)) != 1))[match(df$ID, df1$ID)]
df

这使,

09-25 20:39