簡體   English   中英

根據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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM