2014-07-08 17 views
0

나는 Year와 CountyID로 데이터를 그룹화하려고하는데, 서브 세트 데이터에 splinefun (cubic spline interpolation)을 사용하려고합니다. 나는 아이디어에 개방적이지만, 스플라인 펀은 필수이며 변경할 수 없습니다. 17 CountyIDs 미국의 모든 군에 동일 : Agegrp = 1, 2013 :R - group_by splinefun 활용

여기
age <- seq(from = 0, by = 5, length.out = 18) 

TOT_POP <- df %.% 
group_by(unique(df$Year), unique(df$CountyID) %.% 
splinefun(age, c(0, cumsum(df$TOT_POP)), method = "hyman") 

내 데이터 년도의 샘플 = 2010입니다 : 여기

내가 사용하려고하고있는 코드입니다.

CountyID Year  Agegrp  TOT_POP 
1001  2010  1   3586 
1001  2010  2   3952 
1001  2010  3   4282 
1001  2010  4   4136 
1001  2010  5   3154 

은 내가이 Agegrp 1 복용하고있는 중이 야 : 17 개인 년에 0 그룹화를 분할 - 지금 각 그룹을 84 것은 오년의 표현이다. splinefun을 사용하면이 작업을 수행 할 수 있으며 프로세스의 수학적 정확성 수준을 제공 할 수 있습니다. 즉, splinefun을 사용하면 미국의 각 개별 카운티에서 각 나이의 인구 합계를 제공 할 수 있습니다.

마지막으로, 그 자체로 splinefun 코드 작업을 수행하지만 GROUP_BY 기능 내에서, 그것은 생산하지 않습니다 : 나는 그것을 사용하고있는 방법이

TOT_POP <- splinefun(age, c(0, cumsum(df$TOT_POP)), 
      method = "hyman") 

TOT_POP = pmax(0, diff(TOT_POP(c(0:85)))) 
처럼 작동

Error: wrong result size(4), expected 68 or 1. 

splinefun 코드

1 년 동안 하나의 카운티 ID에서 테스트 한 것입니다. "x"년 동안이 프로세스를 반복해야하고 약 3200 개의 카운티가 필요합니다.

+0

내가 바로 잡아 보자. 두 변수에 따라 데이터 프레임을 분할하려고합니다. 그런 다음 더 작은 데이터 프레임 각각에 대해'splinefun'을 사용하여'age'를'TOT_POP'에 매핑하는 스플라인 함수를 얻고 싶습니까? 그런 다음 원래의 데이터에는 5, 10, 15, 20 세의 인구 만 있기 때문에이 함수를 사용하여 0에서 85 사이의 모든 연령대에서 전체 인구를 보간하고 싶습니다. 아마도'split'과'lapply' 또는'plyr'로 이것을 구현할 수 있고, 뭔가 효과가있다면 누군가가'dplyr'를 가지고 당신을 도울 준비가 잘되어있을 것입니다. – kdauria

+0

splinefun은 Agegrp가 1 : 17이고 한 번에 한 카운티에 대해 1 년 동안 사용되는 데이터의 하위 집합에서 사용됩니다. 마지막 연령 그룹은 0 : 84 개인 년입니다. –

+0

저는 아직도 혼란 스럽습니다. 아마도'df' 데이터 프레임을 변경할 수 있을까요? 'Agegrp'를 연관된'age'로 대체하십시오. 예를 들어,'df $ Agegrp = df $ Agegrp * 5'. 'colnames (df) [3] = "age"'. 이렇게하면 질문이 간단해질 수 있습니다. – kdauria

답변

0
# Reproducible data set 
set.seed(22) 
df = data.frame(CountyID = rep(1001:1005,each = 100), 
       Year = rep(2001:2010, each = 10), 
       Agegrp = sample(1:17, 500, replace=TRUE), 
       TOT_POP = rnorm(500, 10000, 2000)) 

# Convert Agegrp to age 
df$Agegrp = df$Agegrp*5 
colnames(df)[3] = "age" 

# Make a spline function for every CountyID-Year combination 
split.dfs = split(df, interaction(df$CountyID, df$Year)) 
spline.funs = lapply(split.dfs, function(x) splinefun(x[,"age"], x[,"TOT_POP"])) 

# Use the spline functions to interpolate populations for all years between 0 and 85 
new.split.dfs = list() 
for(i in 1:length(split.dfs)) { 
    new.split.dfs[[i]] = data.frame(CountyID=split.dfs[[i]]$CountyID[1], 
            Year=split.dfs[[i]]$Year[1], 
            age=0:85, 
            TOT_POP=spline.funs[[i]](0:85)) 
} 


# Does this do what you want? If so, then it will be 
# easier for others to work from here 
# > head(new.split.dfs[[1]]) 
# CountyID Year age TOT_POP 
# 1  1001 2001 0 909033.4 
# 2  1001 2001 1 833999.8 
# 3  1001 2001 2 763181.8 
# 4  1001 2001 3 696460.2 
# 5  1001 2001 4 633716.0 
# 6  1001 2001 5 574829.9 
# > tail(new.split.dfs[[2]]) 
# CountyID Year age TOT_POP 
# 81  1002 2001 80 10201.693 
# 82  1002 2001 81 9529.030 
# 83  1002 2001 82 8768.306 
# 84  1002 2001 83 7916.070 
# 85  1002 2001 84 6968.874 
# 86  1002 2001 85 5923.268 
0

첫 번째로, 나는 내가 달성하려고 시도했던 것에서 잘못된 말씨를 사용하고 있다고 생각합니다. group_by는 실제로이 문제를 해결하지 않았습니다. 그러나 두 가지 기능과 ddply를 사용하여 문제를 해결할 수있었습니다. 코드는 이제 올해 각 카운티를 받아 인구 데이터의 부분 집합에 splinefun를 실행

interpolate <- function(x, ageVector){ 
result <- splinefun(ageVector, 
      c(0, cumsum(x)), method = "hyman") 
diff(result(c(0:85))) 
} 

mainFunc <- function(df){ 

age <- seq(from = 0, by = 5, length.out = 18) 
colNames <- setdiff(colnames(df) 
      c("Year","CountyID","AgeGrp")) 
colWiseSpline <- colwise(interpolate, .cols = true, 
       age)(df[ , colNames]) 

cbind(data.frame(
Year = df$Year[1], 
County = df$CountyID[1], 
Agegrp = 0:84 
), 
colWiseSpline 
) 
} 

CompleteMainRaw <- ddply(.data = df, 
        .variables = .(CountyID, Year), 
        .fun = mainFunc) 

다음은 문제를 해결 코드입니다. 동시에 결과와 함께 data.frame을 생성합니다. 즉, 17 개의 연령 그룹에서 85 개의 연령 그룹으로 데이터를 분할하면서 적절하게 인수 분해합니다. 그것은 splinefun이하는 일입니다.

감사합니다.