【问题标题】:Assign a group number based on another column by group in R在R中按组分配基于另一列的组号
【发布时间】:2015-04-17 15:17:23
【问题描述】:

这可能非常简单,但我想不出办法来做到这一点。我有一些看起来像这样的数据:

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
    }

我对非循环解决方案完全持开放态度,但这正是我最初的想法。

【问题讨论】:

    标签: r loops for-loop rstudio


    【解决方案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 的 cmets)

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

    【讨论】:

    • 谢谢!我选择了 data.table 解决方案,但它们都很好用!
    • @Hillary 没问题。很高兴为您提供帮助
    猜你喜欢
    • 2021-12-21
    • 1970-01-01
    • 2021-05-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-29
    • 2022-01-07
    • 1970-01-01
    相关资源
    最近更新 更多