根据趋势分配组

时间:2017-09-30 14:43:53

标签: r dataframe

我已经搜索了很多这个简单的问题,但还没有找到解决方案。看起来很简单。我有一个包含如下列的数据框:

Value
0.13
0.35
0.62
0.97
0.24
0.59
0.92
0.16
0.29
0.62
0.98

所有值的范围都在0到1之间。我想要的是当值开始下降时,我为其分配一个新组。在每个组中,值正在增加。所以理想的结果将是这样的:

Value Group
0.13   1
0.35   1
0.62   1
0.97   1
0.24   2
0.59   2
0.92   2
0.16   3
0.29   3
0.62   3
0.98   3

有没有人建议如何解决这个问题?

3 个答案:

答案 0 :(得分:3)

这应该可以解决问题,并且只使用矢量化基本函数。您可能希望将<换成<=,如果这就是您想要的行为。

vec <- c(0.13, 0.35, 0.62, 0.97, 0.24, 0.59, 0.92, 0.16, 0.29, 0.62, 0.98)

cumsum(c(1, diff(vec) < 0))

答案 1 :(得分:2)

这不是最优雅的解决方案,但它有效:

value <- c(0.13, 0.35, 0.62, 0.97, 0.24, 0.59, 0.92, 0.16, 0.29, 0.62, 0.98)

foo <- data.frame(value, group = 1)
current_group <- 1
for(i in 2:nrow(foo)){
  if(foo$value[i] >= foo$value[i-1]){
    foo$group[i] <- current_group
  }else{
    current_group <- current_group + 1
    foo$group[i] <- current_group
  }
}

答案 2 :(得分:2)


df <- data.frame( x = c(0.13, 0.35, 0.62, 0.97, 0.24, 0.59, 0.92, 0.16, 0.29, 0.62, 0.98))
df$y <- c(df$x[-1], NA)  # lag column
df$chgdir <- as.numeric(df$y - df$x < 0)  # test for change in direction
df$chgdir[is.na(df$chgdir)] <- 0  # deal with NA
df$group <- cumsum(df$chgdir) + 1  # determine group number
df[,c("x", "group")]
#>       x group
#> 1  0.13     1
#> 2  0.35     1
#> 3  0.62     1
#> 4  0.97     2
#> 5  0.24     2
#> 6  0.59     2
#> 7  0.92     3
#> 8  0.16     3
#> 9  0.29     3
#> 10 0.62     3
#> 11 0.98     3