r - 使用列的前一行值作为当前行值的参数创建一个新的 tibble
问题描述
我想手动创建一个小标题,其中一个列值是根据同一列的前一个值计算的。
例如:
tibble(
x = 1:5,
y = x + lag(y, default = 0)
)
我期待以下结果:
# A tibble: 5 x 2
x y
<int> <dbl>
1 1 1
2 2 3
3 3 6
4 4 10
5 5 15
但我得到错误:
Error in lag(y, default = 0) : object 'y' not found
更新 - 更真实的例子:
tibble(
years = 1:5,
salary = 20000 * (1.01) ^ lag(years, default = 0),
qta = salary * 0.06
) %>%
mutate(
total = ifelse(row_number() == 1,
(qta + 50000) * (1.02),
(qta + lag(total, default = 0)) * (1.02))
)
在此示例中,我有一个小标题,我想添加一个根据其先前值定义的列“总计”,但lag(total, default = 0)
它不起作用。
解决方案
我们可以用accumulate
library(tidyverse)
tibble(x = 1:5, y = accumulate(x, `+`))
# A tibble: 5 x 2
# x y
# <int> <int>
#1 1 1
#2 2 3
#3 3 6
#4 4 10
#5 5 15
对于一般功能,它将是
tibble(x = 1:5, y = accumulate(x, ~ .x + .y))
我们也可以指定初始化值
tibble(x = 1:5, y = accumulate(x[-1], ~ .x + .y, .init = x[1]))
推荐阅读
- c# - 有什么方法可以使用 .netstandard2.0 或 .netstandard3.0 将 .NETFramework 4.7.1 nuget 安装到项目中
- python - 为什么该插槽被调用两次?
- python - 为什么 pip 安装会抛出这个错误?
- docusaurus - 将 Docusaurus 用于商业项目
- c - 如何计算C中两个移位波信号之间的相移
- javascript - 在循环中访问动态添加的属性
- go - 无法在 Intellij 2020.1 的 golang 包中设置断点
- ios - Xamarin iOS UINavigationBar 奇怪的覆盖
- wso2 - 如何在 wso2is 中自定义默认的自我注册页面
- python - 在python中删除句子的一部分