2017-05-21 6 views
0

R 프로그래밍에 익숙하지 않고 (SAS에서 평생 프로그래밍), 대답을 찾을 수없는 기본 질문이라고 생각합니다. (유사한 질문에 대한 답변을 찾았으나이 질문에 대한 대답은 찾지 못했습니다).R 값의 클러스터에 ID를 할당 R

0 또는 1의 값을 가질 수있는 이진 변수 ("v1"이라고 부름)가 있다고 가정합니다. "v2"라고하는 새 변수를 만들고 싶습니다. 고유 클러스터 ID의 값이 1이 나타납니다의 새 값 또는 1의 문자열이 궁극적으로 0 후에 나타날 때마다, 나는 다음과 같이 V1에서 "V2"를 만들 싶습니다 : 사람의 경우

Obs v1 v2 
1 0 NA 
2 0 NA 
3 1 1 
4 1 1 
5 0 NA 
6 1 2 
7 0 NA 
8 1 3 
9 1 3 
10 1 3 
11 0 NA 
12 1 4 

이것에 관해 밝혀 줄 수 있다면, 나는 매우 감사 할 것입니다. 매우 감사합니다.

답변

6

트릭을 수행합니다. 그룹을 v1 값에 1 씩 증가 수의 누적 합계와 같게 설정 한 다음 0을 다시 NA로 설정합니다. 그래서 주어진 v1에 대한

df$v2 <- cumsum(c(df$v1[1]==1,diff(df$v1)==1)) 
df$v2[df$v1==0] <- NA 
+2

이 V1의 첫 번째 요소는 1 – Lamia

+0

경우 문제가 될 것 같습니다 산출 예 - 죄송합니다 - 상기에서 수정 됨. –

+0

이 테마의 변형 - 'as.numeric (factor (replace (cumsum (! df $ v1),! df $ v1, NA))))' – thelatemail

1

:

v1<-c(0,0,1,1,0,1,0,1,1,1,0,1) 
v1_sum <- unlist(lapply(seq_along(1:length(v1)),function(x) sum(v1[1:x])))#create the cumulative sum per index 
v1_sum[v1==0] <- NA#imputing NA values to v1_sum when v1 is 0 
v1_sum_new_vals <- unlist(lapply(seq_along(1:length(v1_sum)),function(x) {sum(is.na(v1_sum[1:x]))-1}))#cumulative sum of NA's per index 
v2 <- ifelse(!is.na(v1_sum),v1_sum_new_vals,v1_sum)#imputing new values based on a condition 

모두 함께 퍼팅은

df<-data.frame(v1,v2) 
df 
v1 v2 
1 0 NA 
2 0 NA 
3 1 1 
4 1 1 
5 0 NA 
6 1 2 
7 0 NA 
8 1 3 
9 1 3 
10 1 3 
11 0 NA 
12 1 4 
+0

대단히 고마워! – user8045187