gpt4 book ai didi

r - 如何滞后 dplyr 中的同一列?

转载 作者:行者123 更新时间:2023-12-01 22:55:12 25 4
gpt4 key购买 nike

根据本文底部的可重现代码,我正在尝试改变和滞后 R dplyr 中的同一列。该代码没有提供我正在寻找的东西。我做错了什么?

运行代码给我这些不正确的结果,其中 nameCntMult 列是我试图延迟的结果:

> dataFill
# A tibble: 6 x 4
Name Code nameCnt nameCntMult
<chr> <dbl> <int> <dbl>
1 R 0 1 1
2 R 0 2 2
3 T 0 1 1
4 R 0 3 3
5 N 1 1 NA
6 N 1 2 2

当我寻找这些以 XLS 呈现的结果时:

enter image description here

可重现的代码:

library(dplyr)

data <-
data.frame(
Name = c("R","R","T","R","N","N"),
Code = c(0,0,0,0,1,1)
)

dataFill <-data %>%
group_by(Name, Code) %>%
mutate(nameCnt = row_number())%>%
mutate(nameCntMult = nameCnt * 2) %>%
mutate(nameCntMult = ifelse(Code == 0, nameCnt, lag(nameCntMult))) %>%
ungroup()

dataFill

最佳答案

改变 mutateungroup 的顺序会得到你正在寻找的答案:

library(dplyr)

data <-
data.frame(
Name = c("R","R","T","R","N","N"),
Code = c(0,0,0,0,1,1)
)

dataFill <-data %>%
group_by(Name, Code) %>%
mutate(nameCnt = row_number())%>%
mutate(nameCntMult = nameCnt * 2) %>%
ungroup() %>%
mutate(nameCntMult = ifelse(Code == 0, nameCntMult, lag(nameCntMult))) %>%
mutate(nameCntMult = ifelse(Code == 0, nameCntMult, lag(nameCntMult)))

dataFill
#> # A tibble: 6 × 4
#> Name Code nameCnt nameCntMult
#> <chr> <dbl> <int> <dbl>
#> 1 R 0 1 2
#> 2 R 0 2 4
#> 3 T 0 1 2
#> 4 R 0 3 6
#> 5 N 1 1 6
#> 6 N 1 2 6

还两次落后前 6 名。在取消分组之前进行变异时,滞后会查找该组中的最后一个值,但无法在您的第 5 行中找到它,因为它是该组中的第一个。

但这可能不是您正在寻找的完整答案。您是否希望 nameCntMultCode == 0 行中最后一个 nameCnt 值的两倍?

编辑 - 仅使用 dplyr

的更完整的解决方案

这里有一种方法可以根据需要跨越尽可能多的行:

data |> 
group_by(Name, Code) |>
mutate(nameCnt = row_number()) |>
ungroup() |>
mutate(nameCntMult = ifelse(Code == 0, nameCnt * 2, NA)) |>
mutate(grp = cumsum(!is.na(nameCntMult))) |>
group_by(grp) |>
mutate(nameCntMult = max(nameCntMult, na.rm = TRUE)) |>
ungroup() |>
select(-grp)

#> # A tibble: 6 × 4
#> Name Code nameCnt nameCntMult
#> <chr> <dbl> <int> <dbl>
#> 1 R 0 1 2
#> 2 R 0 2 4
#> 3 T 0 1 2
#> 4 R 0 3 6
#> 5 N 1 1 6
#> 6 N 1 2 6

(首先将 NA 分配给 Code == 1 的行,然后使用临时 grp 将这些与先前的非 NA 值分组code> 变量并替换这些行中的 max(nameCntMult))

关于r - 如何滞后 dplyr 中的同一列?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/73425341/

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