Я задал аналогичный вопрос вроде здесь, и упомянутое там решение отлично работает с проблемой, заявленной там, но эта версия немного сложнее и сложнее.
У меня есть таблица данных, подобная этой.
ID1 member
1 a parent
2 a child
3 a parent
4 a child
5 a child
6 b parent
7 b parent
8 b child
9 c child
10 c child
11 c parent
12 c child
И я хочу назначить последовательность, подобную приведенной ниже, в столбце ID1 и member.
ID1 member sequence
1 a parent 1
2 a child 2
3 a parent 1
4 a child 2
5 a child 3
6 b parent 1
7 b parent 1
8 b child 2
9 c child 2 *
10 c child 3
11 c parent 1
12 c child 2
то есть.
> dt$sequence = 1, wherever dt$member == "parent"
> dt$sequence = previous_row_value + 1, wherever dt$member=="child"
Но иногда бывает так, что новый ID1 может не начинаться с member = "parent". Если он начинается с "child" (как в примере со звездообразной строкой), мы должны начать последовательность с 2. На данный момент я делаю это с использованием циклов, как показано ниже.
dt_sequence <- dt[ ,sequencing(.SD), by="ID1"]
sequencing <- function(dt){
for(i in 1:nrow(dt)){
if(i == 1){
if(dt[i,member] %in% "child")
dt$sequence[i] = 2
else
dt$sequence[i] = 1
}
else{
if(dt[i,member] %in% "child")
dt$sequence[i] = as.numeric(dt$sequence[i-1]) + 1
else
dt$sequence[i] = 1
}
}
return(dt)
}
Я запустил этот код в таблице данных из 4e5 строк, и потребовалось много времени для завершения (около 20 минут). Может ли кто-нибудь предложить более быстрый способ сделать это.