gpt4 book ai didi

r - 如何枚举数据框列的值每次发生变化?

转载 作者:行者123 更新时间:2023-12-02 18:12:33 24 4
gpt4 key购买 nike

我有一个位于 DFSurv 下方的数据框,我想创建一个事件列:

if TF[i]==TF[i-1] then Event[i] = Event[i-1] 
else Event[i] = Event[i-1] + 1

应该对每个组 prov 执行此操作,并且延迟是按列 Per 排序计算的。

主要思想是每当 TF 值发生变化时就添加一个。

set.seed(1)
DFSurv = data.frame(Per = c(1:10,1:10,1:10, 1:10),
prov = c(rep("A",10),rep("B",10), rep("D",10),rep("F",10)),
TF = sample(0:1,size=40,replace=TRUE))

使用dplyr::lag时,我得到了错误的结果:

DFSurv %>% mutate(Event = 0) %>%
arrange(prov, Per) %>%
group_by(prov) %>%
mutate(Event = if_else(TF == dplyr::lag(TF, default =0),
dplyr::lag(Event, default =0),
dplyr::lag(Event, default =0)+1))


# A tibble: 40 x 4
# Groups: prov [4]
Per prov TF Event
<int> <chr> <int> <dbl>
1 1 A 0 0
2 2 A 1 1
3 3 A 0 1
4 4 A 0 0
5 5 A 1 1
6 6 A 0 1
7 7 A 0 0
8 8 A 0 0
9 9 A 1 1
10 10 A 1 0
# ... with 30 more rows

这些结果是错误的,因为 Event[3] TF[3] != TF[2] 因此该值应该是 Event[2]+1 即 2 .

这可以通过循环来完成,但首选矢量化方法。

最佳答案

解决问题的本质是cumsum

请注意,我的 set.seed 结果与您的不同。

library(dplyr)

set.seed(1)
DFSurv = data.frame(Per = c(1:10,1:10,1:10, 1:10),
prov = c(rep("A",10),rep("B",10), rep("D",10),rep("F",10)),
TF = sample(0:1,size=40,replace=TRUE))

DFSurv %>%
group_by(prov) %>%
mutate(Event = cumsum(abs(c(0, diff(TF)))))
#> # A tibble: 40 × 4
#> # Groups: prov [4]
#> Per prov TF Event
#> <int> <chr> <int> <dbl>
#> 1 1 A 0 0
#> 2 2 A 1 1
#> 3 3 A 0 2
#> 4 4 A 0 2
#> 5 5 A 1 3
#> 6 6 A 0 4
#> 7 7 A 0 4
#> 8 8 A 0 4
#> 9 9 A 1 5
#> 10 10 A 1 5
#> # … with 30 more rows

reprex package 于 2022 年 5 月 1 日创建(v2.0.1)

关于r - 如何枚举数据框列的值每次发生变化?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/72076811/

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