gpt4 book ai didi

r - 减去上面不是 NA 的数字

转载 作者:行者123 更新时间:2023-12-05 09:03:45 24 4
gpt4 key购买 nike

我有一个类似于这个没有差异列的最小示例的表:

<表类="s-表"><头>触发器值(value)观区别<正文>030不适用0不适用152040不适用1106

我想从每个触发点 (trigger = 1) 的数字中减去上述数字(并省略 NA)

有没有办法在 R 中做到这一点?

编辑:

我现在遇到的情况是触发器靠得很近,就像这个例子一样:

<表类="s-表"><头>触发器值(value)观区别<正文>030不适用0不适用15204151010

我该如何解决这个问题?

最佳答案

在“触发器”上使用cumsum 创建一个分组列并获取滞后,然后对第一个和最后一个元素进行差异处理并替换 它作为每组的 last

library(dplyr)
df1 %>%
group_by(grp = lag(cumsum(trigger), default = 0)) %>%
mutate(difference = replace(rep(NA, n()), n(),
values[n()] - values[1])) %>%
ungroup %>%
select(-grp)

-输出

# A tibble: 7 × 3
trigger values difference
<int> <int> <int>
1 0 3 NA
2 0 NA NA
3 0 NA NA
4 1 5 2
5 0 4 NA
6 0 NA NA
7 1 10 6

对于第二种情况,我们可能需要一个带有 if/else 的条件来检查行数,即 if 行数大于 1 只需要替换

的计算
df2 %>%  
group_by(grp = lag(cumsum(trigger), default = 0)) %>%
mutate(difference = if(n() > 1) replace(rep(NA, n()), n(),
values[n()] - values[1]) else NA) %>%
ungroup

-输出

# A tibble: 7 × 4
trigger values grp difference
<int> <int> <dbl> <int>
1 0 3 0 NA
2 0 NA 0 NA
3 0 NA 0 NA
4 1 5 0 2
5 0 4 1 NA
6 1 5 1 1
7 0 10 2 NA

数据

df1 <- structure(list(trigger = c(0L, 0L, 0L, 1L, 0L, 0L, 1L), values = c(3L, 
NA, NA, 5L, 4L, NA, 10L)), class = "data.frame", row.names = c(NA,
-7L))

df2 <- structure(list(trigger = c(0L, 0L, 0L, 1L, 0L, 1L, 0L), values = c(3L,
NA, NA, 5L, 4L, 5L, 10L)), class = "data.frame", row.names = c(NA,
-7L))

关于r - 减去上面不是 NA 的数字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69577760/

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