2015-01-12 6 views
1

값이 다른 열의 이전 행에 따라 달라지는 새 변수를 생성 중입니다. 따라서 데이터의 순서가 중요합니다. 내 데이터가 현재 보이는 모습입니다.다른 열의 이전 관측 값을 기반으로 새 변수 만들기

ID Cong Comm Y 
1 52 3  0 
1 53 3  0 
1 54 3  1 
1 53 4  1 
2 50 2  1 
2 50 7  1 
3 48 4  1 
4 48 3  1 
4 48 7  0 
4 49 7  1 

Y2라는 새 변수를 만들고 싶습니다. 관측치의 Y = 0이면 동일한 관측치의 Y2는 1이되어야합니다. 다음 행의 Y = 0 인 경우 이전 Y2 값에 1을 더합니다 (이 관측치의 Y2 값은 2와 같아야 함). Y = 1, 1을 추가 할 때까지이 프로세스를 계속 한 다음 프로세스를 중지하십시오. 기본적으로 새 변수는 다른 열의 값이 "1"이 될 때까지 카운트하고 프로세스를 반복합니다.

ID Cong Comm Y Y2 
1 52 3  0 1 
1 53 3  0 2 
1 54 3  1 3 
1 53 4  1 1 
2 50 2  1 1 
2 50 7  1 1 
3 48 4  1 1 
4 48 3  1 1 
4 48 7  0 1 
4 49 7  1 2 

가 여기 내 샘플 dataframe입니다 :

이것은 어떻게 보일지입니다.

data.frame(
ID = c(1L, 1L, 1L, 1L, 2L, 2L, 3L, 4L, 4L, 4L), 
Cong = c(52L, 53L, 54L, 53L, 50L, 50L, 48L, 48L, 48L, 49L), 
Comm = c(3L, 3L, 3L, 4L, 2L, 7L, 4L, 3L, 7L, 7L), 
Y=c(0L, 0L, 1L, 1L, 1L, 1L, 1L, 1L, 0L, 1L)) 

루프 또는 if-else 명령이이 문제를 해결하는 가장 좋은 방법입니까? if-else 문을 시도했지만 코드가 작동하지 않았습니다. 모든 권장 사항은 훌륭합니다.

답변

0

당신은 다음과 같이이 작업을 수행 할 수 있습니다, 당신의 data.frame을 상정하는 것은 df입니다 : 전적으로이 위대한 게시물에 정의

f7 <- function(x){ tmp<-cumsum(x);tmp-cummax((!x)*tmp)} 

:

y = df$Y 
bool=y==c(0, head(y, -1)) 
y[which(bool %in% F)] = 0 

df$Y2 = ifelse(y==0, f7(!y), 1) 

# ID Cong Comm Y Y2 
#1 1 52 3 0 1 
#2 1 53 3 0 2 
#3 1 54 3 1 3 
#4 1 53 4 1 1 
#5 2 50 2 1 1 
#6 2 50 7 1 1 
#7 3 48 4 1 1 
#8 4 48 3 1 1 
#9 4 48 7 0 1 
#10 4 49 7 1 2 

이 트릭은 이루어집니다 count how many consecutive values are true

마지막으로이 솔루션은 전적으로 vectori입니다 zed, 반복 없음.

관련 문제