【问题标题】:Recursive function that operates on its own preceding output对自己的先前输出进行操作的递归函数
【发布时间】:2016-09-26 17:36:34
【问题描述】:

我有特定基准年份的价格(在本例中为 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))

我想要的输出(最后一列,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)

这是我得到的错误:

错误:找不到对象“Price_AllYears”

如果我必须使用 Excel,我会使用以下方法:

    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

【问题讨论】:

  • 我猜这个问题是几个小时前发布的。此外,cmets 要求更新之前的问题。
  • @akrun 对:stackoverflow.com/q/37494332 即使在那里,第一条评论说“这应该是对您的旧问题的编辑或评论,而不是新问题。”所以这可能是这个问题的第三次迭代......

标签: r loops recursion matrix dataframe


【解决方案1】:

fun 输入一组行号,这些行的子集MyData 并确定基值的索引ix.base。首先检查是否有一个基准价格,如果没有则返回 NA;否则,计算基数之前的乘数,hd,和基数之后的乘数,tl。对于其中的每一个,我们可以使用cumprod 来避免问题中电子表格公式中显示的迭代计算类型。最后将计算的乘数乘以基本价格。使用ave 将此应用于每个城市。没有使用任何包:

fun <- function(ix) with(MyData[ix, ], {
  ix.base <- which(!is.na(Price_BaselineYear))
  if (length(ix.base) != 1) return(NA)
  hd <- rev(cumprod(rev(1/head(MultiplicationFactor, ix.base)[-1])))
  tl <- cumprod(tail(MultiplicationFactor, - ix.base))
  Price_BaselineYear[ix.base] * c(hd, 1, tl)
})
transform(MyData, Price_AllYears = ave(seq_along(Year), City, FUN = fun))

给予:

   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

【讨论】:

  • 谢谢大家!谢谢你,@G。格洛腾迪克。它适用于上述示例数据集,但是当我将其用于更大的数据集时,我收到此错误“错误:长度(n)== 1L 不是 TRUE”
  • 为了以防万一,我添加了基线存在检查。可能还有其他错误或极端情况也可能从检查中受益,但希望以上给出了这个想法,您可以根据实际数据与问题中显示的数据之间存在的差异从那里得到它。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-12-06
  • 2015-05-13
  • 2021-12-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多