gpt4 book ai didi

r - 如果任何剩余值为 0,则将值设置为 0

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

我有一个像这样的 data.frame:

dat <- data.frame("ID"=c(rep(1,13),rep(2,5)), "time"=c(seq(1,13),c(seq(1,5))), "value"=c(rep(0,5), rep(1,3), 2, 0, 1, 5, 20, rep(0,2), seq(1:3)))
ID time value
1 1 1 0
2 1 2 0
3 1 3 0
4 1 4 0
5 1 5 0
6 1 6 1
7 1 7 1
8 1 8 1
9 1 9 2
10 1 10 0
11 1 11 1
12 1 12 5
13 1 13 20
14 2 1 0
15 2 2 0
16 2 3 1
17 2 4 2
18 2 5 3

我的目标是将所有值设置为 0,如果在剩余的值中有任何其他 0(对于每个唯一的 ID 和按时间排序)。这意味着在示例数据中,我希望在 6:9 行中有 0

我试过 dat %>% group_by(ID) %>% mutate(value2 = ifelse(lead(value, order_by=time)==0, 0, value)) 但我会运行几次,因为它一次只更改一行(即先更改第 9 行,然后再更改第 8 行等)。

dplyr 解决方案将是首选,但我会采取一切工作:)

简短的解释:值是肿瘤的大小。如果肿瘤没有变大,但后来实际上完全消失了,很可能是不相关的包裹,因此应编码为“零肿瘤”。

最佳答案

我不确定这是否是您想要的输出,但也许它对您有用

dat %>%
group_by(ID) %>%
arrange(-time) %>%
mutate(value = if_else(cumsum(value == 0) > 0, 0, value)) %>%
arrange(ID, time)

ID time value
<dbl> <int> <dbl>
1 1 1 0
2 1 2 0
3 1 3 0
4 1 4 0
5 1 5 0
6 1 6 0
7 1 7 0
8 1 8 0
9 1 9 0
10 1 10 0
11 1 11 1
12 1 12 5
13 1 13 20
14 2 1 0
15 2 2 0
16 2 3 1
17 2 4 2
18 2 5 3

Basicalyl,我首先将观察结果按降序排列。然后我检查值是否为零(cumsum(value == 0) > 0))。如果是,我将所有剩余值设置为零。最后,我再次将观察结果按正确的顺序排列。

如果您不想对数据进行排序和重新排序,可以使用以下代码,该代码依赖于相同的逻辑,但更难阅读:

dat %>%
group_by(ID) %>%
arrange(ID, time) %>%
mutate(value = if_else(cumsum(value == 0) < sum(value == 0), 0, value))

或者没有if_else会更高效:

dat %>%
group_by(ID) %>%
arrange(ID, time) %>%
mutate(value = value * (cumsum(value == 0) >= sum(value == 0)))

关于r - 如果任何剩余值为 0,则将值设置为 0,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62952522/

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