根据R中的另一列分配组编号

时间:2015-04-17 15:17:23

标签: r loops for-loop rstudio

这可能非常简单,但我无法找到实现这一目标的方法。我有一些看起来像这样的数据:

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
    }

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

1 个答案:

答案 0 :(得分:3)

你可以尝试

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