【问题标题】:generate id within group在组内生成 id
【发布时间】:2021-12-16 07:54:33
【问题描述】:

我有以下数据集

varA <- c(rep("A",2), rep("B",4))
varB <- c(rep("aaaa",2), rep("bbbb", 3), rep("cccc",1) )

dat <- data.frame(varA, varB)
dat 
  varA varB
1    A aaaa
2    A aaaa
3    B bbbb
4    B bbbb
5    B bbbb
6    B cccc

我想为每个子组生成 id,例如 varA 中的第一个子组为 1,第二个为 2,依此类推。 Theids 可以在整个数据集中重复,但不能在子组内重复。

这是需要的结果

  varA varB res
1    A aaaa   1
2    A aaaa   1
3    B bbbb   1
4    B bbbb   1
5    B bbbb   1
6    B cccc   2 

我怎样才能用 R 做到这一点?

我在 dplyr 中尝试了 cur_group_id() 但它对我不起作用...

谢谢!!

【问题讨论】:

  • VarA 在哪里?另外为什么第1组是B bbbb,第2组是B cccc?规则是什么?
  • 这能回答你的问题吗? R - Group by variable and then assign a unique ID
  • 在你的情况下,因为它是两个变量,所以它是dat %&gt;% mutate(id = group_indices(., varA, varB))
  • @Sotos 感谢 cmets。规则是 id 必须在 varA 内生成。也就是说,varA 中只有一个子组。所以 id 是 1。在 varB 中有 2 个子组,需要给它们 id 1 和 2。
  • 啊,没关系,我错过了 varA 中重复的 ID。 Sotos 有一个很好的答案。

标签: r


【解决方案1】:

你可以使用data.table::rleid(),即

library(dplyr)

df %>% 
 group_by(VarA) %>% 
 mutate(id = data.table::rleid(VarB))

# A tibble: 6 x 3
# Groups:   VarA [2]
#  VarA  VarB     id
#  <chr> <chr> <int>
#1 A     aaaa      1
#2 A     aaaa      1
#3 B     bbbb      1
#4 B     bbbb      1
#5 B     bbbb      1
#6 B     cccc      2

【讨论】:

    【解决方案2】:

    另一个潜在的解决方案:

    library(tidyverse)
    varA <- c(rep("A",2), rep("B",4))
    varB <- c(rep("aaaa",2), rep("bbbb", 3), rep("cccc",1) )
    
    dat <- data.frame(varA, varB)
    
    dat %>%
      group_by(varA) %>%
      mutate(count = ifelse(varB != lag(varB, default = "NA"),
                           1, 0)) %>%
      mutate(rleid = cumsum(count))
    #> # A tibble: 6 × 4
    #> # Groups:   varA [2]
    #>   varA  varB  count rleid
    #>   <chr> <chr> <dbl> <dbl>
    #> 1 A     aaaa      1     1
    #> 2 A     aaaa      0     1
    #> 3 B     bbbb      1     1
    #> 4 B     bbbb      0     1
    #> 5 B     bbbb      0     1
    #> 6 B     cccc      1     2
    

    reprex package 创建于 2021-12-16 (v2.0.1)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-11-24
      • 2023-03-23
      • 1970-01-01
      • 2021-11-15
      • 1970-01-01
      • 2021-09-15
      • 1970-01-01
      • 2022-12-10
      相关资源
      最近更新 更多