R根据同一列中的前一个单元格值生成单元格值

R根据同一列中的前一个单元格值生成单元格值,r,loops,dplyr,mutate,coding-efficiency,R,Loops,Dplyr,Mutate,Coding Efficiency,我目前正在基于某些数据进行模拟。最终游戏是生成一列,其中第一个值基于一个公式,然后第二个、第三个和第四个值基于前一个值。(例如,条目n°2依赖于n°1,n°3依赖于n°2)我已经通过运行mutate函数3次解决了这个问题。但是,考虑到整洁性,我希望有一个短循环,或者使用其中一个apply函数一次执行所有3个重复。有什么建议吗 下面是一个例子: sampleframe <- data.frame("value1" = c(15,18,22,19),

我目前正在基于某些数据进行模拟。最终游戏是生成一列,其中第一个值基于一个公式,然后第二个、第三个和第四个值基于前一个值。(例如,条目n°2依赖于n°1,n°3依赖于n°2)我已经通过运行mutate函数3次解决了这个问题。但是,考虑到整洁性,我希望有一个短循环,或者使用其中一个apply函数一次执行所有3个重复。有什么建议吗

下面是一个例子:

sampleframe <- data.frame("value1" = c(15,18,22,19),
                          "value2" = c(12,14,13,12),
                          "parameter" = c(0.8,NA,NA,NA))

sampleframe <- sampleframe %>%
  mutate("value3" = value2 * parameter)
值3中的每个项都将乘以值2。问题是在值2之后添加常量:

sampleframe %>% 
  mutate(
    value3 = if_else(row_number() == 1, value2*parameter, value2 + value1),
    value3 = accumulate(value3, prod)
  )
不会产生期望的结果,因为我不希望value1乘以value2。在第二任期中增加:

sampleframe %>% 
  mutate(
    value3 = if_else(row_number() == 1, value2*parameter, value2),
    value3 = accumulate(value3, prod) + value1
  )

也不起作用,因为它将value1作为块添加到最后,这意味着第1行和第2行计算正确,但第3行和第4行计算不正确。我尝试了我能想到的任何方法来使这个命令工作,但是我对purrr包不够熟悉,无法找到修复方法。有什么想法吗?

将我的答案局限于您当前的方法,您可以通过使用for循环来提高效率:

number\u迭代次数=3
#设置

sampleframe您可以从
{purrr}
使用
accumulate()
并按顺序相乘

sampleframe %>% 
  mutate(
    value3 = if_else(row_number() == 1, value2*parameter, value2),
    value3 = accumulate(value3, prod)
  )


#   value1 value2 parameter  value3
# 1     15     12       0.8     9.6
# 2     18     14        NA   134.4
# 3     22     13        NA  1747.2
# 4     19     12        NA 20966.4

才华横溢,很有魅力。非常感谢。当我想在公式中添加另一列而不让它相乘时,我尝试使用acculate,但不知怎的,我找不出一个好方法来实现这一点。我编辑了我的问题以包含您的答案,并使问题更好地反映我的问题。是否可以为值1添加另一条if_else语句?不知道我是否理解正确。在代码段中,我创建了值3、4和5来显示步骤。您还可以使用value3将它们组合起来。sampleframe%>%mutate(value3=if_-else(row_-number()==1,value2*参数,value2),value4=accumulate(value3,prod),value5=if_-else(row_-number()==1,value4,value4+value2))嘿,谢谢你的回答,它工作得很好!如果你对如何以更好的方式做这件事有任何想法,我不介意听听。
sampleframe %>% 
  mutate(
    value3 = if_else(row_number() == 1, value2*parameter, value2 + value1),
    value3 = accumulate(value3, prod)
  )
sampleframe %>% 
  mutate(
    value3 = if_else(row_number() == 1, value2*parameter, value2),
    value3 = accumulate(value3, prod) + value1
  )
sampleframe %>% 
  mutate(
    value3 = if_else(row_number() == 1, value2*parameter, value2),
    value3 = accumulate(value3, prod)
  )


#   value1 value2 parameter  value3
# 1     15     12       0.8     9.6
# 2     18     14        NA   134.4
# 3     22     13        NA  1747.2
# 4     19     12        NA 20966.4