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