gpt4 book ai didi

r - 根据 R 中的前一行在序列中分配值

转载 作者:行者123 更新时间:2023-12-04 12:10:52 26 4
gpt4 key购买 nike

我有一个这样的数据表。

  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

IE。
> dt$sequence = 1, wherever dt$member == "parent"

> dt$sequence = previous_row_value + 1, wherever dt$member=="child"

到目前为止,我一直在使用循环来做它,如下所示。
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)
}

我在 400 000 行的数据表上运行了这段代码,花了很多时间来完成(大约 15 分钟)。
任何人都可以建议一种更快的方法来做到这一点。

最佳答案

这是 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 到组中元素数量的序列。

关于r - 根据 R 中的前一行在序列中分配值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27335527/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com