2016-05-28 8 views
1

私は、特定のベースライン年(この場合は1993年)の価格と、すべての年の倍率を持っています。これらの既知の増倍率を使用して、ベースライン年度の後にまたは前のすべての年の(プロジェクト)価格を計算したいと思います。入力データを構築するこれまでの出力で動作する再帰関数

Year City MultiplicationFactor Price_BaselineYear 
1990 New York   NA   NA 
1991 New York   0.9   NA 
1992 New York   2.0   NA 
1993 New York   0.8   100 
1994 New York   0.6   NA 
1995 New York   0.8   NA 
1996 New York   2.0   NA 
1990 Boston    NA   NA 
1991 Boston    1.6   NA 
1992 Boston    1.25   NA 
1993 Boston    0.5   200 
1994 Boston    1.75   NA 
1995 Boston    2.5   NA 
1996 Boston    0.5   NA 

コード:

myData<-structure(list(Year = c(1990L, 1991L, 1992L, 1993L, 1994L, 1995L,1996L, 1990L, 1991L, 1992L, 1993L, 1994L, 1995L, 1996L), City = structure(c(2L,2L, 2L, 2L, 2L, 2L, 2L, 1L, 1L, 1L, 1L, 1L, 1L, 1L), .Label = c("Boston","New York"), class = "factor"), MultiplicationFactor = c(NA,0.9, 2, 0.8, 0.6, 0.8, 2, NA, 1.6, 1.25, 0.5, 1.75, 2.5, 0.5),`Price(BaselineYear)` = c(NA, NA, NA, 100L, NA, NA, NA, NA,NA, NA, 200L, NA, NA, NA)), .Names = c("Year", "City", "MultiplicationFactor","Price_BaselineYear"), class = c("tbl_df", "tbl", "data.frame"), row.names = c(NA, -14L)) 

Iは、(最後の列、Price_AllYears)希望出力:ここ

は、入力されたデータである

Year City MultiplicationFactor Price_BaselineYear Price_AllYears 
1990 New York NA     NA     69.4 
1991 New York 0.9     NA     62.5 
1992 New York 2.0     NA     125.0 
1993 New York 0.8     100     100.0 
1994 New York 0.6     NA     60.0 
1995 New York 0.8     NA     48.0 
1996 New York 2.0     NA     96.0 
1990 Boston  NA     NA     200.0 
1991 Boston  1.6     NA     320.0 
1992 Boston  1.25    NA     400.0 
1993 Boston  0.5     200     200.0 
1994 Boston  1.75    NA     350.0 
1995 Boston  2.5     NA     875.0 
1996 Boston  0.5     NA     437.5 

ここまで私は@alistaireに感謝しています:

myData %>% 
    group_by(City) %>% 
    arrange(Year) %>% 
    mutate(Price_AllYears = ifelse(Year < Year[which(!is.na(Price_BaselineYear))], 
         lead(Price_AllYears)/lead(MultiplicationFactor), 
         ifelse(Year > Year[which(!is.na(Price_BaselineYear))], 
           lag(Price_AllYears) * MultiplicationFactor, 
           Price_BaselineYear)))%>% 
    ungroup() %>% 
    arrange(City) 

これは私が取得エラーです:

A  B  C      D     E 
1 Year City MultiplicationFactor Price_BaselineYear Price_AllYears 
2 1990 New York NA     NA     E3/C3 
3 1991 New York 0.9     NA     E4/C4 
4 1992 New York 2.0     NA     E5/C5 
5 1993 New York 0.8     100     D5 
6 1994 New York 0.6     NA     E5*C6 
7 1995 New York 0.8     NA     E6*C7 
8 1996 New York 2.0     NA     E7*C8 
9 1990 Boston  NA     NA     E10/C10 
10 1991 Boston  1.6     NA     E11/C11 
11 1992 Boston  1.25    NA     E12/C12 
12 1993 Boston  0.5     200     D12 
13 1994 Boston  1.75    NA     E12*C13 
14 1995 Boston  2.5     NA     E13*C14 
15 1996 Boston  0.5     NA     E14*C15 
+0

が、私はこの質問が戻っていくつかの時間を投稿された推測しています。また、コメントは、前の質問の更新を要求しました。 – akrun

+2

@akrun右:http://stackoverflow.com/q/37494332/最初のコメントは、「これは新しい質問ではなく古い質問に対する編集やコメントでなければなりません」と述べています。これはこの質問の3番目の繰り返しかもしれません... – Frank

答えて

1

funは、行番号のセットを入力し、サブセットを:ここで

Error: object 'Price_AllYears' not found

は、私はExcelを使用していた場合、私が使用する方法であり、これらの行にMyDataを追加し、ベース値のインデックスを決定します。ix.base。最初に正確に1つのベースライン価格があることを確認し、NAを返さない場合は、それ以外の場合は、基数の前の乗数をhd、基数の後には、tlと計算します。これらのそれぞれについて、cumprodを使用して、問題のスプレッドシートの式に示されている反復計算の種類を回避できます。最後に、計算された乗数に基本価格を掛けます。これを各都市に適用するにはaveを使用してください。いいえパッケージが使用されていません:

を与える:

Year  City MultiplicationFactor Price_BaselineYear Price_AllYears 
1 1990 New York     NA     NA   69.444 
2 1991 New York     0.90     NA   62.500 
3 1992 New York     2.00     NA  125.000 
4 1993 New York     0.80    100  100.000 
5 1994 New York     0.60     NA   60.000 
6 1995 New York     0.80     NA   48.000 
7 1996 New York     2.00     NA   96.000 
8 1990 Boston     NA     NA  200.000 
9 1991 Boston     1.60     NA  320.000 
10 1992 Boston     1.25     NA  400.000 
11 1993 Boston     0.50    200  200.000 
12 1994 Boston     1.75     NA  350.000 
13 1995 Boston     2.50     NA  875.000 
14 1996 Boston     0.50     NA  437.500 
+1

ありがとうございました! ありがとう、@G。 Grothendieck。上記のサンプルデータセットで動作しますが、これを大きなデータセットに使用すると、エラー:length(n)== 1LがTRUEではないというエラーが表示されます。 –

+0

ベースラインの有無をチェックしました。チェックの恩恵を受ける可能性がある他のエラーやコーナーケースもあるかもしれませんが、うまくいけば、実際のデータと質問に表示されているデータとの間にどのような違いがあるかに基づいて考えてください。 –

関連する問題