2016-11-01 4 views
-1

간단한 나누기 공식을 사용하여 연간 계획 수립에 도움이 필요합니다. 몇 가지 열의 고유 한 조합마다이 작업을 수행해야하며 연간 열에서 월별 열로 나누어 진 열을 복사해야합니다. 루프는 수식을 두 개의 열에 적용하고 벡터의 개별 그룹을 반복합니다. 나는 다소 복잡한 것처럼 아래 예제에서 설명하려고 노력했다.함수가 단일 행을 여러 행으로 집계 할 때 열 데이터 복사 R

내가 무엇을 가지고 :

| Init | Name | Date |Total Savings|Total Costs| 
| A | John | 2015 | TotalD | TotalD | 
| A | Mike | 2015 | TotalE | TotalE | 
| A | Rob | 2015 | TotalF | TotalF | 
| B | John | 2015 | TotalG | TotalG | 
| B | Mike | 2015 | TotalH | TotalH | 
...... 
| Init | Name | Date |Total Savings|Total Costs| 
| A | John | 2016 | TotalI | TotalI | 
| A | Mike | 2016 | TotalJ | TotalJ | 
| A | Rob | 2016 | TotalK | TotalK | 
| B | John | 2016 | TotalL | TotalL | 
| B | Mike | 2016 | TotalM | TotalM | 

내가 12에 의해 "총 저축"과 "총 비용"과 분열을 적용하려면 첫 번째 행에 대한 루프 기능을거야 어디 = 2015 년 9 날짜 날짜 = 2016 년 (YTD에서 9 월) 각각에 대해 개별 행을 만듭니다. 나는 본질적으로 연간 총계를 끊고 한 해의 매월 행을 생성합니다. "Init", "Name"조합이 뚜렷하지 않을 때까지 "Init", "Name"열을 복사하는 루프를 실행하는 데 도움이 필요합니다. 또한 년도에 따라 나누기 공식도 다를 수 있습니다. 2015 년과 2016 년에 데이터 세트를 분리하고 두 개의 다른 함수를 사용하여 병합하는 것이 더 쉬울 것이라고 생각합니다. 이 2015
토탈/9 * = MonthE위한 수식이다 - -이 2016

수식은 어떤 도움이 인정 될 것이다

| Init | Name | Date  |Monthly Savings|Monthly Costs| 
| A | John | 01-01-2015 | TotalD/12* | MonthD | 
| A | John | 02-01-2015 | MonthD  | MonthD | 
| A | John | 03-01-2015 | MonthD  | MonthD | 
... 
| A | Mike | 01-01-2016 | TotalE/9* | TotalE | 
| A | Mike | 02-01-2016 | TotalE  | TotalE | 
| A | Mike | 03-01-2016 | TotalE  | TotalE | 
... 
| B | John | 01-01-2015 | TotalG/12* | MonthD | 
| B | John | 02-01-2015 | MonthG  | MonthD | 
| B | John | 03-01-2015 | MonthG  | MonthD | 

TotalD/12 * = MonthD 아래 출력되어야 ...로 시작

답변

0

, 열이 몇 가지 기술로 재현 데이터가있다 :

myData <- 
    data.frame(
    Init = rep(LETTERS[1:3], each = 4) 
    , Name = rep(c("John", "Mike"), each = 2) 
    , Date = 2015:2016 
    , Savings = (1:12)*1200 
    , Cost = (1:12)*2400 
) 

다음에, fo를 사용하는 제수 설정 R 매년 : I가 단일 행으로 데이터를 분할로

toDivide <- 
    c("2015" = 12, "2016" = 9) 

그리고, I는 해당 행의 개수 (9, 12)에 각 행을 확장 한 다음 lapply 그들을 통해 반복 상기 magrittr 파이프를 사용하고 저축과 비용을 개월 수로 나눈 값입니다. 마지막으로 dplyrbind_rows은 행을 다시 묶습니다. 확장 된 각 행에 대해 유사한 항목이

Init Name  Date Savings  Cost 
1  A John 2015-01-01 100.0000 200.0000 
2  A John 2015-02-01 100.0000 200.0000 
3  A John 2015-03-01 100.0000 200.0000 
4  A John 2015-04-01 100.0000 200.0000 
5  A John 2015-05-01 100.0000 200.0000 
6  A John 2015-06-01 100.0000 200.0000 

:

myData %>% 
    split(1:nrow(.)) %>% 
    lapply(function(x){ 
    temp <- data.frame(
     Init = x$Init 
     , Name = x$Name 
     , Date = as.Date(paste(x$Date 
          , formatC(1:toDivide[as.character(x$Date)] 
            , width = 2, flag = "0") 
          , "01" 
          , sep = "-")) 
     , Savings = x$Savings/toDivide[as.character(x$Date)] 
     , Cost = x$Cost/toDivide[as.character(x$Date)] 
    ) 
    }) %>% 
    bind_rows() 

이의 head는 것 같습니다.

+0

감사합니다. @ 마크. 불행히도이 예제는 실제 데이터 프레임의보기를 단순화했습니다. 40 개가 넘는 별개의 "init"값과 서로 다른 "name"값 (항상 패턴을 반복하지는 않음)이 있으므로, "Init"== "Name"조합이있을 때마다 루프를 다시 시작하기를 바라고 있습니다. – CGermain

+0

"루프 재시작"이란 무엇을 의미합니까? 9/12 행 (월별 분석)으로 각 행 (연간 요약)을 분해하려고합니까 또는 내가 누락 된 추가 부분이 있습니까? 이것은 초기화/이름 값에 관계없이 각 행을 분할합니다. –

+0

저는 "Init"와 "Name"이 다양한 조합으로 변경 될 때마다 같은 조합 인 각 연간 요약에 대해 연간 요약을 9/12 행으로 나누려고합니다. 내가 언급했듯이 약 40 개의 별개의 "초기화"값 (프로젝트 이니셔티브 이름)과 10 개 정도의 "이름"값 (이들은 부서명 임)이 있습니다. 각 "Init"에는 저축을보고하는 몇 가지 "이름"(부서)이 있으므로 매월 저축/비용 행에있는 사람들을 보존하면서 모든 구상 성취 및 부서 조합에 대해 매월 저축 및 비용을 제시해야합니다. 이것이 더 의미가 있습니까? – CGermain