2
다음과 같은 데이터 테이블이 있습니다. vals
이 0
이고 다른 곳에 누락 된 경우 플래그는 1
입니다.R 데이터 테이블의 시퀀스로 NA 값을 채우십시오.
dt <- data.table(vals = c(0,2,4,1,0,4,3,0,3,4))
dt[vals == 0, flag := 1]
> dt
vals flag
1: 0 1
2: 2 NA
3: 4 NA
4: 1 NA
5: 0 1
6: 4 NA
7: 3 NA
8: 0 1
9: 3 NA
10: 4 NA
출력을 아래의 seq
열과 같이 표시하고 싶습니다. 즉, 열은 vals
이 0
일 때마다 1에서 시작하고 vals
이 0
일 때 다음 행까지 카운트 업하는 일련의 시퀀스를 포함해야합니다. flag
은 설명 된 목표를 달성하는 데 도움이되는 경우에만 유용합니다.
> dt
vals seq
1: 0 1
2: 2 2
3: 4 3
4: 1 4
5: 0 1
6: 4 2
7: 3 3
8: 0 1
9: 3 3
10: 4 3
원래, 어떻게 든 cumsum()
를 사용하는 방법에 대한 생각,하지만 난 그것을 효과적으로 사용하는 방법을 알아낼 수 없습니다.
내 현재 솔루션은 꽤 추합니다.
dt <- data.table(vals = c(0,2,4,1,0,4,3,0,3,4))
dt[vals == 0, flag := 1]
dt[, flag_rleid := rleid(flag)]
# group on the flag_rleid column
dt[, flag_seq := seq_len(.N), by = flag_rleid]
# hideous subsetting to avoid incrementing the first appearance of a 1
dt[vals != 0, flag_seq := flag_seq + 1]
# flag_seq is the desired column
> dt
vals flag flag_rleid flag_seq
1: 0 1 1 1
2: 2 NA 2 2
3: 4 NA 2 3
4: 1 NA 2 4
5: 0 1 3 1
6: 4 NA 4 2
7: 3 NA 4 3
8: 0 1 5 1
9: 3 NA 6 2
10: 4 NA 6 3
개선 된 점이 인정됩니다.