【问题标题】:Assign group numbers within IDs to rows separated by zeros将 ID 中的组号分配给以零分隔的行
【发布时间】:2021-04-09 21:01:15
【问题描述】:

我有以下数据集:

ID<-rep(c("A","B"),times=c(4,8))
Group<-c(1,1,0,1,1,1,0,1,1,1,0,1)
data<-data.frame(ID,Group)
data

 ID Group
 A     1
 A     1
 A     0
 A     1
 B     1
 B     1
 B     0
 B     1
 B     1
 B     1
 B     0
 B     1

我想创建一个名为“编号”的列,其中 Group=1 的连续行都分配了相同的编号。这个数字应该从 1 开始,并随着下一组连续行上升。当 Group = 0 时,我希望对应的 Number 值等于 0。 一旦 ID 更改,我还希望 Numbers 行重置为 1。

这是一个示例:

ID Group Number
A     1      1
A     1      1
A     0      0
A     1      2
B     1      1
B     1      1
B     0      0
B     1      2
B     1      2
B     1      2
B     0      0
B     1      3

我正在考虑在 Dplyr 中使用 group_by 和 mutate 函数,但我不确定除此之外还能做什么。任何帮助将不胜感激!

【问题讨论】:

    标签: r dataframe


    【解决方案1】:

    以下使用cumsum 技巧,与ave 一起应用,以获取每组ID 上的Number

    data$Number <- ave(data$Group, data$ID, FUN = function(G){
      G*(cumsum(G == 0) + (G[1] == 1))
    })
    
    data
    #   ID Group Number
    #1   A     1      1
    #2   A     1      1
    #3   A     0      0
    #4   A     1      2
    #5   B     1      1
    #6   B     1      1
    #7   B     0      0
    #8   B     1      2
    #9   B     1      2
    #10  B     1      2
    #11  B     0      0
    #12  B     1      3
    

    【讨论】:

      【解决方案2】:

      rleid 的选项来自data.table

      library(data.table)
      setDT(data)[, grp := rleid(Group), ID][, Number := 0]
      data[Group == 1, Number := match(grp, unique(grp)), Group][, grp := NULL][]
      

      【讨论】:

        【解决方案3】:

        在基础 R 中使用 rle

        transform(data, Number = ave(Group, ID, FUN = function(x) 
          with(rle(x == 1), rep(cumsum(values) * values, lengths))))
        
        #   ID Group Number
        #1   A     1      1
        #2   A     1      1
        #3   A     0      0
        #4   A     1      2
        #5   B     1      1
        #6   B     1      1
        #7   B     0      0
        #8   B     1      2
        #9   B     1      2
        #10  B     1      2
        #11  B     0      0
        #12  B     1      3
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2023-01-20
          • 2019-12-28
          • 1970-01-01
          • 1970-01-01
          • 2022-12-10
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多