根据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到组中元素数的序列。您能解释一下吗?