根据R中的前一行按顺序赋值

根据R中的前一行按顺序赋值,r,data.table,R,Data.table,我有一个这样的数据表 ID1 ID2 member 1 a x parent 2 a y child 3 a z parent 4 a p child 5 a q child 6 b x parent 7 b z parent 8 b q child 我想分配一个序列,如下所示 ID1 ID2 member sequence 1 a x parent 1 2 a y child

我有一个这样的数据表

  ID1 ID2 member
1   a   x parent
2   a   y  child
3   a   z parent
4   a   p  child
5   a   q  child
6   b   x parent
7   b   z parent
8   b   q  child
我想分配一个序列,如下所示

  ID1 ID2 member sequence
1   a   x parent        1
2   a   y  child        2
3   a   z parent        1
4   a   p  child        2
5   a   q  child        3
6   b   x parent        1
7   b   z parent        1
8   b   q  child        2
dt_sequence <- dt[ ,sequencing(.SD), by="ID1"]

sequencing <- function(dt){
  for(i in 1:nrow(dt)){
    if(i == 1){
      dt$sequence[i] = 1
      next
    }
    if(dt[i,member] %in% "child"){
      dt$sequence[i] = as.numeric(dt$sequence[i-1]) + 1
    }
    else
      dt$sequence[i] = 1
  }
  return(dt)
}
i、 e

到目前为止,我一直在使用循环,如下所示

  ID1 ID2 member sequence
1   a   x parent        1
2   a   y  child        2
3   a   z parent        1
4   a   p  child        2
5   a   q  child        3
6   b   x parent        1
7   b   z parent        1
8   b   q  child        2
dt_sequence <- dt[ ,sequencing(.SD), by="ID1"]

sequencing <- function(dt){
  for(i in 1:nrow(dt)){
    if(i == 1){
      dt$sequence[i] = 1
      next
    }
    if(dt[i,member] %in% "child"){
      dt$sequence[i] = as.numeric(dt$sequence[i-1]) + 1
    }
    else
      dt$sequence[i] = 1
  }
  return(dt)
}

dt_序列这里有一种方法是
seq

dt[ , sequence := seq(.N), by = cumsum(member == "parent")]

#    ID1 ID2 member sequence
# 1:   a   x parent        1
# 2:   a   y  child        2
# 3:   a   z parent        1
# 4:   a   p  child        2
# 5:   a   q  child        3
# 6:   b   x parent        1
# 7:   b   z parent        1
# 8:   b   q  child        2
它是如何工作的


命令
member==“parent”
创建一个逻辑向量。函数
cumsum
用于计算累计和。在这种情况下,它将创建一个向量,其中父对象和以下子对象具有相同的编号。此向量用于分组。最后,
seq(.N)
创建一个从1到组中元素数的序列。

您能解释一下吗?