2015-01-08 2 views
6

연령 집단에 대한 출산율을 예측하는 모델을 개발 중입니다. 나는 현재 열이 나이이고 열이 몇 년인이 같은 데이터 프레임을 가지고있다.R에서 데이터 프레임 대각선을 행으로 변환합니다.

> df1 
    iso3 sex age fert1953 fert1954 fert1955 
14 AUS female 13 0.000 0.00000 0.00000 
15 AUS female 14 0.000 0.00000 0.00000 
16 AUS female 15 13.108 13.42733 13.74667 
17 AUS female 16 26.216 26.85467 27.49333 
18 AUS female 17 39.324 40.28200 41.24000 

그러나, 내가 원하는 것은 집단 될 각 행은 다음과 같습니다 각 셀의 값은 그 해 연령별 출산율이다. 행과 열은 개별 연도를 나타내므로 코호트 데이터는 대각선을 가져 와서 얻을 수 있습니다. 이 같은 결과를 찾고 있어요 :

> df2 
    iso3 sex ageIn1953 fert1953 fert1954 fert1955 
14 AUS female  13 0.000 0.00000 13.74667 
15 AUS female  14 0.000 13.42733 27.49333 
16 AUS female  15 13.108 26.85467 41.24000 
17 AUS female  16 26.216 40.28200 [data..] 
18 AUS female  17 39.324 [data..] [data..] 

다음은 df1 데이터 프레임의 :

df1 <- structure(list(iso3 = c("AUS", "AUS", "AUS", "AUS", "AUS"), sex = c("female", 
"female", "female", "female", "female"), age = c(13, 14, 15, 
16, 17), fert1953 = c(0, 0, 13.108, 26.216, 39.324), fert1954 = c(0, 
0, 13.4273333333333, 26.8546666666667, 40.282), fert1955 = c(0, 
0, 13.7466666666667, 27.4933333333333, 41.24)), .Names = c("iso3", 
"sex", "age", "fert1953", "fert1954", "fert1955"), class = "data.frame", row.names = 14:18) 

편집 :

여기에 내가 궁극적으로 사용되는 솔루션입니다. 그것은 David의 답을 바탕으로했지만, 각 레벨의 iso3에 대해이 작업을 수행해야했습니다.

df.ls <- lapply(split(f3, f = f3$iso3), FUN = function(df1) { 
    n <- ncol(df1) - 4 
    temp <- mapply(function(x, y) lead(x, n = y), df1[, -seq_len(4)], seq_len(n)) 
    return(cbind(df1[seq_len(4)], temp)) 
}) 
f4 <- do.call("rbind", df.ls) 
+0

당신이 당신을 지연 하시겠습니까 데이터 세트? –

+0

네,하지만 그건 매우 귀찮은 일이라고 생각합니다. 저는 50 년 동안 188 개국에서이 일을하고 있습니다. 그렇게 할 수있는 좋은 방법을 생각할 수 있다면 좋은 해결책이 될 수 있습니다. – rsoren

답변

4
내가 속도를 테스트하지 않았습니다

하지만 data.tablev1.9.5는 최근라는 새로운 (C로 작성) 리드/지연 기능은 이동하려는 열의 그래서 shift

을 구현 잠재적으로 수 예를 들어,이 mapply과 함께

library(data.table) 
n <- ncol(df1) - 4 # the number of years - 1 
temp <- mapply(function(x, y) shift(x, n = y, type = "lead"), df1[, -seq_len(4)], seq_len(n)) 
cbind(df1[seq_len(4)], temp) # combining back with the unchanged columns 
# iso3 sex age fert1953 fert1954 fert1955 
# 14 AUS female 13 0.000 0.00000 13.74667 
# 15 AUS female 14 0.000 13.42733 27.49333 
# 16 AUS female 15 13.108 26.85467 41.24000 
# 17 AUS female 16 26.216 40.28200  NA 
# 18 AUS female 17 39.324  NA  NA 

편집을 사용 : 쉽게 개발을 설치할 수 있습니다 당신이 dplyr을 원하는 경우,

library(devtools) 
install_github("Rdatatable/data.table", build_vignettes = FALSE) 

어느 방법을 사용하여 GitHub의에서 data.table의 버전은 여기 여기

library(dplyr) 
n <- ncol(df1) - 4 # the number of years - 1 
temp <- mapply(function(x, y) lead(x, n = y), df1[, -seq_len(4)], seq_len(n)) 
cbind(df1[seq_len(4)], temp) 
# iso3 sex age fert1953 fert1954 fert1955 
# 14 AUS female 13 0.000 0.00000 13.74667 
# 15 AUS female 14 0.000 13.42733 27.49333 
# 16 AUS female 15 13.108 26.85467 41.24000 
# 17 AUS female 16 26.216 40.28200  NA 
# 18 AUS female 17 39.324  NA  NA 
+0

멋집니다. 불행히도 v1.9.4는 CRAN의 최신 data.table 버전이며 GitHub에서 dev 버전을 다운로드하는 데 문제가 있습니다. 분명히 이것은 Windows에서 일반적인 문제입니다. 나는 dplyr의'''lead()''함수를 ​​대신 사용하고있다. 나는 그것이 작동해야한다고 생각합니다 ... – rsoren

+0

내 편집을 참조하십시오 –

+0

나는'''iso3''' (위의 편집 참조)의 각 값에 대해 별도로 수행해야한다는 사실을 고려하여 조정했습니다. data.table 문제는 "Command failed (1)"오류가 발생하여 보통''install_github()''가 더 어려워졌습니다. 이것에 대한 링크가 data.table의 설치 페이지에 있습니다. 감사합니다! – rsoren

1

간다 기본 R의 접근 방식 :

df1[,5:ncol(df1)] <- mapply(function(x, y) {vec.list <- df1[-1:-y, x] 
         length(vec.list) <- nrow(df1) 
         vec.list}, 
         x=5:ncol(df1), y=1:(ncol(df1)-4)) 
df1 
# iso3 sex age fert1953 fert1954 fert1955 
#14 AUS female 13 0.000 0.00000 13.74667 
#15 AUS female 14 0.000 13.42733 27.49333 
#16 AUS female 15 13.108 26.85467 41.24000 
#17 AUS female 16 26.216 40.28200  NA 
#18 AUS female 17 39.324  NA  NA 
관련 문제