首页 > 解决方案 > 如何检查数字是否仅在一组中增加?

问题描述

我想检查组(ID)中的“状态”列,看看数字是否只会增加。

例子:

df <-data.frame("ID" = c("A","A","A","B","B","B"),
                "State"=c(1,2,3,1,4,2))
df %>%
  group_by(ID) %>% 
  mutate(Check = ifelse(State > State[row.number() + 1], TRUE, FALSE)))

和我希望的输出:检查:A - TRUE B - FALSE(因为在这个例子中 1,4,2 数字增加但随后减少)

标签: rif-statementtidyverse

解决方案


编辑:检查 Yuriy 的答案以查看更紧凑的解决方案,如果您一开始不了解diffall发挥作用,可能更难阅读


代码

require(tidyverse)

(
  df
  %>% group_by(ID)
  %>% mutate(Diff = State - lag(State))
  %>% filter(! is.na(Diff))
  %>% summarise(Increasing = all(Diff >= 0))
)

输出

# A tibble: 2 x 2
  ID    Increasing
  <chr> <lgl>           
1 A     TRUE            
2 B     FALSE  

解释

(
  df
  %>% group_by(ID)
  %>% mutate(Diff = State - lag(State))
)

  ID    State  Diff
  <chr> <dbl> <dbl>
1 A         1    NA
2 A         2     1
3 A         3     1
5 B         1    NA
6 B         4     3
7 B         2    -2

在每个子组中计算与上线的差异

(
  df
  %>% group_by(ID)
  %>% mutate(Diff = State - lag(State))
  %>% filter(! is.na(Diff))
  %>% summarise( all(Diff >= 0))
) 

这些NA行被删除,然后我们必须检查是否存在负数。


数据样本

require(tidyverse)

df <- tribble( ~ ID, ~ State,
                "A",       1,
                "A",       2,
                "A",       3,
                "B",       1,
                "B",       4,
                "B",       2
               )

推荐阅读