gpt4 book ai didi

r - 如何在只有一个初始值的情况下使用滞后/领先?

转载 作者:行者123 更新时间:2023-12-05 03:52:58 25 4
gpt4 key购买 nike

示例 df:

library(tidyverse)

iris <- iris[1:10,]
iris$testlag <- NA
iris[[1,"testlag"]] <- 5

Sepal.Length Sepal.Width Petal.Length Petal.Width Species testlag
1 5.1 3.5 1.4 0.2 setosa 5
2 4.9 3.0 1.4 0.2 setosa NA
3 4.7 3.2 1.3 0.2 setosa NA
4 4.6 3.1 1.5 0.2 setosa NA
5 5.0 3.6 1.4 0.2 setosa NA
6 5.4 3.9 1.7 0.4 setosa NA
7 4.6 3.4 1.4 0.3 setosa NA
8 5.0 3.4 1.5 0.2 setosa NA
9 4.4 2.9 1.4 0.2 setosa NA
10 4.9 3.1 1.5 0.1 setosa NA

teSTLag 列中,我对使用 dplyr::lag() 检索先前的值并添加一些列很感兴趣,例如 Petal .Length 到它。由于我只有一个初始值,每个后续计算都需要它迭代工作,所以我认为像 mutate 这样的东西会起作用。

我第一次尝试做这样的事情:

iris %>% mutate_at("testlag", ~ lag(.) + Petal.Length)

但这删除了第一个值,并且只为第二行提供了有效值,为其余行提供了 NA。凭直觉我知道它为什么要删除第一个值,但我认为 mutate 的性质将允许它对其余值起作用,所以我不知道如何解决这个问题。

当然,使用 base R 我可以这样:

for (idx in 2:nrow(iris)) {
iris[[idx, "testlag"]] <-
lag(iris$testlag)[idx] + iris[[idx, "Petal.Length"]]
}

但我更愿意用 tidyverse 语法来实现它。

编辑:所需的输出(来 self 的 for 循环)

   Sepal.Length Sepal.Width Petal.Length Petal.Width Species testlag
1 5.1 3.5 1.4 0.2 setosa 5.0
2 4.9 3.0 1.4 0.2 setosa 6.4
3 4.7 3.2 1.3 0.2 setosa 7.7
4 4.6 3.1 1.5 0.2 setosa 9.2
5 5.0 3.6 1.4 0.2 setosa 10.6
6 5.4 3.9 1.7 0.4 setosa 12.3
7 4.6 3.4 1.4 0.3 setosa 13.7
8 5.0 3.4 1.5 0.2 setosa 15.2
9 4.4 2.9 1.4 0.2 setosa 16.6
10 4.9 3.1 1.5 0.1 setosa 18.1

最佳答案

这对你有用吗?

library(tidyverse)
library("data.table")

iris <- iris[1:10,]
iris$testlag <- NA
iris[[1,"testlag"]] <- 5

iris %>% mutate (testlag = lag(first(testlag) + cumsum(Petal.Length)))

结果:

   Sepal.Length Sepal.Width Petal.Length Petal.Width Species testlag
1 5.1 3.5 1.4 0.2 setosa NA
2 4.9 3.0 1.4 0.2 setosa 6.4
3 4.7 3.2 1.3 0.2 setosa 7.8
4 4.6 3.1 1.5 0.2 setosa 9.1
5 5.0 3.6 1.4 0.2 setosa 10.6
6 5.4 3.9 1.7 0.4 setosa 12.0
7 4.6 3.4 1.4 0.3 setosa 13.7
8 5.0 3.4 1.5 0.2 setosa 15.1
9 4.4 2.9 1.4 0.2 setosa 16.6
10 4.9 3.1 1.5 0.1 setosa 18.0

由于技术上当 N = 1 时没有 N-1 Petal 长度,所以我保留了 teSTLag NA 的第一个值。你真的需要它作为初始值吗?如果您需要,这将起作用:

iris %>% mutate (testlag = lag(first(testlag) + cumsum(Petal.Length), default=first(testlag)))

关于r - 如何在只有一个初始值的情况下使用滞后/领先?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61919721/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com