2017-01-26 17 views
2

다음과 같은 데이터 테이블이 있습니다. vals0이고 다른 곳에 누락 된 경우 플래그는 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 열과 같이 표시하고 싶습니다. 즉, 열은 vals0 일 때마다 1에서 시작하고 vals0 일 때 다음 행까지 카운트 업하는 일련의 시퀀스를 포함해야합니다. 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 

개선 된 점이 인정됩니다.

답변

2

우리는 우리가 순서 콜 럼을 얻을에 따라 다음 그룹화 변수를 만들 수 cumsum와 논리적 인덱스를 사용할 수 있습니다

dt[, flag_seq := seq_len(.N), cumsum(vals ==0)] 
dt 
# vals flag flag_seq 
# 1: 0 1  1 
# 2: 2 NA  2 
# 3: 4 NA  3 
# 4: 1 NA  4 
# 5: 0 1  1 
# 6: 4 NA  2 
# 7: 3 NA  3 
# 8: 0 1  1 
# 9: 3 NA  2 
#10: 4 NA  3 
관련 문제