【问题标题】:R populating columns based on previous valuesR根据以前的值填充列
【发布时间】:2017-10-07 20:00:42
【问题描述】:

我正在尝试填充这样的系列。

                My result                 ACTUAL         Expected       
FWK_SEQ_NBR  a  initial_d   initial_c   b   c   d       b   c   d
914        9.161    131       62        0   62  69      0   62  69
915        9.087    131       0         0   53  78      0   53  78
916        8.772    131       0         0   44  140     0   44  87
917        8.698    131       0         0   0   140     0   35  96
918        7.985    131       0        69   52  139    69   96  35
919        6.985    131       0        78   63  138    78  168   0
920        7.077    131       0       140   126 138    87  247   0
921        6.651    131       0       140   126 138    96  336   0
922        6.707    131       0       139   125 138    35  364   0

逻辑

a     given
b     lag of d by 4
c     initial c for first week thereafter (c previous row + b current - a current)
d     initial d - c current

这是我使用的代码

DS1 = DS %>% 
mutate(c    = ifelse(FWK_SEQ_NBR == min(FWK_SEQ_NBR), intial_c, 0)   ) %>%
mutate(c    = lag(c) + b - a)) %>% 
mutate(d    = initial_d - c) %>% 
mutate(d    = ifelse(d<0,0,d)) %>%
mutate(b    = shift(d, n=4, fill=0, type="lag"))

我没有得到正确的 c,你知道我错过了什么吗?我还附上了实际和预期输出的图像。感谢您的帮助!

Actual and Expected values Image

第二张图片 - 将产品和商店添加到列列表中

Image - Product and Store as the first two columns- please help

以下是实际代码,我还复制了预期和实际输出的图像。谢谢!

【问题讨论】:

  • 很难理解你想要做什么。请编辑以提供abcd 的示例值(如果适用),然后提供您想要的输出。
  • 现在更有意义了。谢谢
  • 您确定,您列出的问题和操作顺序正确吗?您从d 派生b,从ba 派生c,其中b 依赖于d,然后又从c 派生d。这将产生递归计算问题。
  • 我能够在excel中很好地实现c逻辑。对于 c 计算,我从前一行的 c 值和 b 和 a 的当前值中获取。我尝试在循环中实现 C 但没有运气。感谢您的回复。
  • 你的操作顺序是什么? a 已给出。假设bccd 之前计算是否公平?你能分享一下bdR 代码吗?

标签: r generate-series


【解决方案1】:

您的示例不是我所说的可重现的,并且代码 sn-p 也没有提供太多关于您尝试做什么的见解。然而,来自 excel 的屏幕图像非常有帮助。这是我的解决方案

df <- as.data.frame(cbind(a = c(1:9), b = 0, c = 0, d = NA))
c_init = 62
d_init = 131
df$d <- d_init
df$c[1] <- c_init # initial data frame is ready at this stage

iter <- dim(df)[1] # for the loop to run item times

for(i in 1:iter){
  if(i>4){
    df[i, "b"] = df[i-4,"d"] # Calculate b with the lag
  }
 if(i>1){
    df[i, "c"] = df[i-1, "c"] + df[i, "b"] - df[i, "a"] # calc c
  }
  df[i, "d"] <- d_init - df[i, "c"] # calc d
  if(df[i, "d"] < 0) {
    df[i, "d"] <- 0 # reset negative d values
  }
}

【讨论】:

  • 还有一个问题,假设除了“FWK_SEQ_NBR”之外,我还有 2 个附加变量“Product”和“store”,我需要对这些变量进行排序以计算这些变量,你将如何改变它。
  • 我不确定我是否完全理解,但是我认为您要问的是是否还有其他列定义了需要重新计算的行,我将如何处理?我会将df 分成两部分,并专注于子集以提高性能。计算后将其与另一部分合并。这只是一种方法。如果您有一个初始和预期数据框的示例,我可以更有信心地提出建议。
  • 你能帮忙解决这个问题吗?在同一个问题中,我还有两个变量 Product 和 Store 需要用来生成这个系列。我已经通过使用 for Store 和 Product 尝试了嵌套循环,但这需要很多时间。你知道一个更好的方法来实现这一点。我附上了第二张图片以获得更多背景信息。感谢您的帮助。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-06-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-02-05
相关资源
最近更新 更多