% fill(Outcome, .dire-6ren">
gpt4 book ai didi

r - 用 1 填充列直到找到值,然后重复填充 0 直到再次找到值

转载 作者:行者123 更新时间:2023-12-05 00:43:28 25 4
gpt4 key购买 nike

我有以下数据框:

miniDF1 <- data.frame(Pred = c("A","A","B","A","B","B","C","A","B","C","A","A","A","A","B","A","C","B"))

Pred
1 A
2 A
3 B
4 A
5 B
6 B
7 C
8 A
9 B
10 C
11 A
12 A
13 A
14 A
15 B
16 A
17 C
18 B

我正在尝试创建一个用 1 填充的新列,直到在 Pred 中找到“C”,然后用 0 填充新列,直到找到下一个“C”,然后重复这样直到DF结束。我尝试了以下方法:

miniDF1 <- miniDF1 %>%
mutate(Outcome = ifelse(str_detect(Pred, "C"), 1, 0)) %>%
fill(Outcome, .direction = 'up')

Pred Outcome
1 A 0
2 A 0
3 B 0
4 A 0
5 B 0
6 B 0
7 C 1
8 A 0
9 B 0
10 C 1
11 A 0
12 A 0
13 A 0
14 A 0
15 B 0
16 A 0
17 C 1
18 B 0

但这只是将 1 放在有“C”所在的同一行中。

这是预期的样子:

miniDF2 <- data.frame(Pred = c("A","A","B","A","B","B","C","A","B","C","A","A","A","A","B","A","C","B"),
Outcome = c(1,1,1,1,1,1,1,0,0,0,1,1,1,1,1,1,1,0))

Pred Outcome
1 A 1
2 A 1
3 B 1
4 A 1
5 B 1
6 B 1
7 C 1
8 A 0
9 B 0
10 C 0
11 A 1
12 A 1
13 A 1
14 A 1
15 B 1
16 A 1
17 C 1
18 B 0

我不知道如何让值相应地翻转,但我认为这就是我的代码的 fill(Outcome, .direction = 'up') 部分的目的做。

最佳答案

miniDF1$Outcome <- cumsum(c(1, head(miniDF1$Pred == 'C', -1))) %% 2

miniDF1
Pred Outcome
1 A 1
2 A 1
3 B 1
4 A 1
5 B 1
6 B 1
7 C 1
8 A 0
9 B 0
10 C 0
11 A 1
12 A 1
13 A 1
14 A 1
15 B 1
16 A 1
17 C 1
18 B 0

在 tidyverse:

library(dplyr)
miniDF1 %>%
mutate(Outcome = cumsum(lag(Pred == 'C', default = TRUE)) %% 2)

关于r - 用 1 填充列直到找到值,然后重复填充 0 直到再次找到值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70256160/

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