我有一个类似于这个没有差异列的最小示例的表:
我想从每个触发点 (trigger = 1) 的数字中减去上述数字(并省略 NA)
有没有办法在 R 中做到这一点?
编辑:
我现在遇到的情况是触发器靠得很近,就像这个例子一样:
我该如何解决这个问题?
最佳答案
在“触发器”上使用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))
https://stackoverflow.com/questions/69577760/
相关文章:
flutter - 如何修复 vscode 上的 Flutter_localizations 错误?
c# - GraphQL : Not Getting EF Related objects afte
haskell - 为什么我的 ByteString 在我的 x86_64 架构上是 BigEndi
amazon-web-services - 在哪里可以找到 AWS ARN 中服务和资源类型部分的可
arrays - 为什么我在执行 strcat() 时得到错误的源字符串输出?