2017-09-30 9 views
0

この簡単な質問はたくさん検索しましたが、解決策が見つかりませんでした。それは本当に簡単に見えます。トレンドに基づいてグループを割り当てます。

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 

これに対処する方法の提案はありますか?

答えて

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 
    } 
} 
+0

これは、if-elseが本質的なロジックに戻り、私の複雑なデータセットで機能します。パッケージ内の関数を使用するよりもはるかに優れています。ありがとう、ブレンダン! –

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 
+0

非常に良い解決策! cumsumは間違いなく動作します!ありがとう、たくさんの男! –

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)) 
+0

これは私の提案よりもはるかに巧妙な解決策であり、値ベクトルが大きければ速くなります。 –

関連する問題