在R中按组分配基于另一列的组号

Assign a group number based on another column by group in R

这可能非常简单,但我想不出办法。我有一些数据如下所示:

domain  difference
xxxx    0
xxxx    2
xxxx    14
xxxx    3
xxxx    7
xxxx    2
yyyy    6
yyyy    5
yyyy    13
yyyy    10
zzzz    2
zzzz    5
zzzz    1
zzzz    15
zzzz    16
zzzz    8
zzzz    9

我希望它看起来像这样:

domain  difference  grp
xxxx    0           1
xxxx    2           1
xxxx    14          2
xxxx    3           2
xxxx    7           2
xxxx    2           2
yyyy    6           1
yyyy    5           1
yyyy    13          1
yyyy    10          1
zzzz    2           1
zzzz    5           1
zzzz    1           1
zzzz    15          2
zzzz    16          3
zzzz    8           3
zzzz    9           3

所以基本上按域我想为几行分配一个组号,如果差异大于或等于 14。当差异大于或等于 14 时,为前面的行分配一个组号.

我试过使用嵌套的 for 循环,其中域是水平的,但我觉得这可能不必要地复杂,而且我不确定如何告诉循环继续前进并从它离开的地方开始分配第一个组号后关闭。这是我目前所拥有的:

lev <- levels(e_won$domain)
lev <- levels(e_won$domain)
for (i in 1:length(lev)) { 
  for (j in 1:nrow(lev)){
    if (difference[j] >= 14) {
      grp[1:j] = 1
    }

我完全接受非循环解决方案,但这正是我最初的想法。

你可以试试

library(data.table)
setDT(df1)[, grp:=cumsum(difference>=14)+1L, by=domain][]
#    domain difference grp
#1:   xxxx          0   1
#2:   xxxx          2   1
#3:   xxxx         14   2
#4:   xxxx          3   2
#5:   xxxx          7   2
#6:   xxxx          2   2
#7:   yyyy          6   1
#8:   yyyy          5   1
#9:   yyyy         13   1
#10:  yyyy         10   1
#11:  zzzz          2   1
#12:  zzzz          5   1
#13:  zzzz          1   1
#14:  zzzz         15   2
#15:  zzzz         16   3
#16:  zzzz          8   3
#17:  zzzz          9   3

或使用dplyr

 df1 %>%
    group_by(domain) %>% 
    mutate(grp= cumsum(difference >=14)+1L)

或使用base R(来自@Colonel Beauvel 的评论)

df1$grp <- with(df1, ave(difference>=14, domain, FUN=cumsum)) + 1L