捕获具有相同值和其他条件的符号变化

capture change in sign with same value and other conditions

我有一个如下所示的数据框:

df   <-  data.frame(id1 = c(232, 232, 232,233, 233, 233), value = c(20.1, -11.1, 11.1,  3.1, -4.1, 4.1), 
                  dt = c('11-20', '11-02', '11-02', '11-03', '11-04','11-04'), id2 = c(21, 22, 23, 21, 25 ,26))
 

我想

  1. 按 id1 分组
  2. 创建一个新的逻辑列'flag'
  3. 标志应该为真
    • 当id1有相同的dt时
    • 相同的值但符号相反并且
    • 不同的 id2

预期的输出将如下所示

 id1 value    dt id2  flag
1 232  20.1 11-20  21  FALSE
2 232 -11.1 11-02  22  TRUE
3 232  11.1 11-02  23  TRUE
4 233   3.1 11-03  21  FALSE
5 233  -4.1 11-04  25  TRUE
6 233   4.1 11-04  26  TRUE

我们可能需要 absolute 专栏来执行此操作。按'id1'和'value'列的absolute值进行分组,检查是否有两个值(n() == 2)以及distinct[=16]的个数=] 是 2。如果有超过 2 个元素,并且如果我们正在检查是否发生了不止一次反转,则将条件更改为 n() > 1 & n_distinct(sign(value)) > 1(不清楚 OP 的逻辑 post)

library(dplyr)
df %>% 
  group_by(id1, grp = abs(value)) %>%
  mutate(flag = n() == 2& n_distinct(sign(value)) == 2) %>%
  ungroup %>% 
  select(-grp)

-输出

# A tibble: 6 × 5
    id1 value dt      id2 flag 
  <dbl> <dbl> <chr> <dbl> <lgl>
1   232  20.1 11-20    21 FALSE
2   232 -11.1 11-02    22 TRUE 
3   232  11.1 11-02    23 TRUE 
4   233   3.1 11-03    21 FALSE
5   233  -4.1 11-04    25 TRUE 
6   233   4.1 11-04    26 TRUE