2016-10-01 1 views
2

나는 여러 해를 기준으로 한 여러 해를 기준으로 한 데이터를 가지고 있습니다. 칼럼의 연도 수와 같고, 각 컬럼은 1 년 동안의 결과를 원합니다. 이제, 목적은 매년 별도로 더미를 만드는 것입니다. 예를 들어 2000 년의 출력 열은 주 데이터에서 2000 년과 병행하지 않는 관찰이있을 때마다 값 "1"을 가져야하며 그렇지 않으면 "0"이어야합니다. 또한 NA는 NA로 유지되어야합니다. 입력 데이터의 작은 샘플은 아래를 참조하시기 바랍니다 : 내 데이터 프레임에서 더미 변수 행렬을 만듭니다. 누락 된 값에 대해 'NA'를 사용하십시오.

df: 
2000 NA 
2001 NA 
2002 -1.3 
2000 1.1 
2001 0 
2002 NA 
2000 -3 
2001 3 
2002 4.1 

지금 출력이되어야한다 :

df1: 
2000 2001 2002 
NA  NA  NA 
NA  NA  NA 
0  0  1 
1  0  0 
0  1  0 
NA  NA  NA 
1  0  0 
0  1  0 
0  0  1 

나는 가능하면 "루프"를 사용하여 출력을 얻기 위해 선호하는 것이다. 그렇지 않으면, 더 간단한 접근법은 인정 될 것이다.

답변

3

루프가 필요 없습니다. 우리는 model.matrix를 사용할 수 있습니다

## your data variable and NA index 
x <- c(NA, NA, -1.3, 1.1, 0, NA, -3, 3, 4.1) 
na_id <- is.na(x) 

## code your year variable as a factor 
year <- factor(rep(2000:2002, 3)) 

## original model matrix; drop intercept to disable contrast 
X <- model.matrix(~ year - 1) 

# year2000 year2001 year2002 
#1  1  0  0 
#2  0  1  0 
#3  0  0  1 
#4  1  0  0 
#5  0  1  0 
#6  0  0  1 
#7  1  0  0 
#8  0  1  0 
#9  0  0  1 

## put NA where `x` is NA (we have used recycling rule here) 
X[na_id] <- NA 

# year2000 year2001 year2002 
#1  NA  NA  NA 
#2  NA  NA  NA 
#3  0  0  1 
#4  1  0  0 
#5  0  1  0 
#6  NA  NA  NA 
#7  1  0  0 
#8  0  1  0 
#9  0  0  1 

매트릭스 X을 몇 가지 특성을 갖습니다. 당신이 원하는 경우이를 삭제할 수 있습니다 :

attr(X, "assign") <- attr(X, "contrasts") <- NULL 

또한 다른 것으로이 행렬의 열 이름을 바꿀 수 있습니다,

colnames(X) <- 2000:2002 
+0

감사 @Zheyuan처럼. 그러나 이것은 연대순으로 반복되는 경우에 적용 할 수 있습니다. 2000 년이 세 번, 2001 년이 두 번, 그리고 2002 년이 끝나고 세 번 반복되는 상황은 어떨까요? 이 경우 어떻게이 코드를 수정할 수 있습니까? – Saba

+1

감사합니다. 그게 정말 도움이. – Saba

관련 문제