首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用r减去与标准匹配的行块

使用r减去与标准匹配的行块
EN

Stack Overflow用户
提问于 2022-10-12 09:44:39
回答 1查看 54关注 0票数 0

我想从一个dataframe中减去行块,然后进行更多的计算。例如,我希望在每个grp变量中减去与以下条件相匹配的行块:

  • 1,块的开始满足以下条件:
    • val变量为负值,时间变量为1;
    • 或val变量在正val变量之后为负值。

  • 2、块的结尾满足以下条件:
    • val变量在负val变量之后为正变量。

代码语言:javascript
复制
df <- tribble(
  ~grp, ~time, ~val,
  "A",  1,     1,
  "A",  2,    -0.3,
  "A",  3,    -0.4,
  "A",  5,     0.5,
  "A",  7,    -0.1,
  "A",  9,     0.9,
  "B",  1,    -0.1,
  "B",  2,    -0.4,
  "B",  3,     0.3,
  "B",  5,     0.1,
  "B",  7,     0.4,
  "B",  9,     -0.1
)

根据上述标准,我们希望得到以下数据框架:

代码语言:javascript
复制
result <- tribble(
  ~grp, ~time, ~val,
  "A",  2,    -0.3,
  "A",  3,    -0.4,
  "A",  5,     0.5,
  "A",  7,    -0.1,
  "A",  9,     0.9,
  "B",  1,    -0.1,
  "B",  2,    -0.4,
  "B",  3,     0.3
)

利用结果数据框架,可以计算出从负到正的状态转换时间。

代码语言:javascript
复制
final <- tribble(
  ~grp, ~tran_time, 
  "A",  (5-2) + (9-7),   
  "B",  3-1
)

要减的行块的图形

我可以编写循环来实现这些目标,但是可以使用矢量化方法来实现上述目标吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-10-12 11:31:54

使用您的逻辑,我们可以使用slice

代码语言:javascript
复制
library(dplyr)

df1 <- df |> 
    slice(which.max((val < 0 & time == 1) | (val < 0 & lag(val) > 0)):max(which(lag(val) < 0 & val > 0)))

  grp    time   val
  <chr> <dbl> <dbl>
1 A         2  -0.3
2 A         3  -0.4
3 A         5   0.5
4 A         7  -0.1
5 A         9   0.9
6 B         1  -0.1
7 B         2  -0.4
8 B         3   0.3

您可以使用countadd_count而不是group_by来总结转换时间。

代码语言:javascript
复制
df2 <- df1 |> 
    add_count(a = ifelse(val < 0, cumsum(val > 0) + 1, cumsum(val > 0)), wt = max(time) - min(time)) |> 
    count(grp, wt = sum(unique(n)), name = "trans_time")

  grp   trans_time
  <chr>      <dbl>
1 A              5
2 B              2
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/74039767

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档