R语言 如何在不覆盖数据框中现有数据的情况下进行变异?

rseugnpd  于 2023-01-15  发布在  其他
关注(0)|答案(2)|浏览(156)

下面是我将使用的示例数据框架。difference列表示时间上的价格差异。例如,2001年的价格预测为6 + 3 = 9
| 时间|差|价格|
| - ------|- ------|- ------|
| 二○ ○ ○年|不适用|六个|
| 二○ ○一年|三个|不适用|
| 二○ ○二年|四个|不适用|
| 二○ ○三年|六个|不适用|
| 二○ ○四年|-8个|不适用|
现在,我正在使用的代码如下,它是不工作的,因为如果我循环它,它会覆盖以前的数据时,即使我这样做。

Data <- Data %>%
  mutate(new_price = difference + lag(new_price))

我正在寻找的一段代码,可以完成在一次点击列表,这样的预期结果将是
| 时间|差|价格|
| - ------|- ------|- ------|
| 二○ ○ ○年|不适用|六个|
| 二○ ○一年|三个|九|
| 二○ ○二年|四个|十三|
| 二○ ○三年|六个|十九|
| 二○ ○四年|-8个|十一|
任何解决方案都是受欢迎的,非常感谢你们。

e3bfsja2

e3bfsja21#

请试试这个

library(tidyverse)
dat <- data.frame(time=c(2000,2001,2002,2003,2004,2005), diff=c(NA, 3, 4, 6, -8, 10), price=c(6, NA, NA, NA, NA, NA))
dat2 <- dat %>% mutate(price=cumsum(coalesce(diff,price)))
xmd2e60i

xmd2e60i2#

另一种方法是使用purrr中的accumulate,提供数据向量(diff,没有第一个元素)、函数+(在本例中)和初始值(price中的第一个值)。

library(tidyverse)

dat %>%
  mutate(price = accumulate(diff[-1],
                            `+`,
                            .init = price[1]))
    • 产出**
time diff price
1 2000   NA     6
2 2001    3     9
3 2002    4    13
4 2003    6    19
5 2004   -8    11
6 2005   10    21

相关问题