2017-01-09 7 views
1

セグメントと値を持つdata.frame()があります。 値が十分に近い場合、セグメントをマージしたいです。マージ後続セグメントの値

再現性の例 -

set.seed(4) 
df <- data.frame(start = seq(from = 1, to = 91, by = 10), 
       end = seq(from = 10, to = 100, by = 10), 
       value = rnorm(10)) 

print(df) 
    start end  value 
1  1 10 0.2167549 
2  11 20 -0.5424926 
3  21 30 0.8911446 
4  31 40 0.5959806 
5  41 50 1.6356180 
6  51 60 0.6892754 
7  61 70 -1.2812466 
8  71 80 -0.2131445 
9  81 90 1.8965399 
10 91 100 1.7768632 

以降のセグメント間の違いは

for(i in 1:9) print(abs(df$value[i] - df$value[i+1])) 
[1] 0.7592474 
[1] 1.433637 
[1] 0.2951641 
[1] 1.039637 
[1] 0.9463426 
[1] 1.970522 
[1] 1.068102 
[1] 2.109684 
[1] 0.1196767 

レットである私はdiffが1よりも小さく、値は、平均であるべきセグメントをマージしたいと言いますセグメント値。一方が他方の後、私は1つにの3をマージしたい3つのセグメントがある場合 結果はthis-

start end  value 
1  1 20 -0.1628689 
2 21 40 0.7435626 
3 41 60 1.1624467 
4 61 70 -1.2812466 
5 71 80 -0.2131445 
6 81 10 1.8367015 

のようになります。

これを行う簡単な方法はありますか?

答えて

1

解決策は次のとおりです。 変数weightは、マージセグメントの数を表します。

set.seed(4) 
df <- data.frame(start = seq(from = 1, to = 91, by = 10), 
       end = seq(from = 10, to = 100, by = 10), 
       value = rnorm(10)) 


df$weight <- 1 #initialize the number of merge segment 

for (i in 1:(nrow(df)-1)){ 

    if (abs(df$value[i] - df$value[i+1]) < 1 & df$weight[i] < 3) { 
    #the second part of the condition limit a 3 the maximum number of segement merge (can be change to x segment) 

    df$end[i] <- df$end[i+1] 
    df$value[i] <- weighted.mean(df$value[c(i, i+1)],df$weight[c(i, i+1)]) 
    df$weight[i] <- df$weight[i]+1 
    df[i+1,] <- df[i,] 
    df[i,]$weight <- 0 

    } 

} 
df <- df[df$weight > 0,] 
+0

@ T.G。私はあなたがマージされたセグメントの最大数を定義できるように応答を編集します。 – timat

+0

ありがとう! Rには何らかの組み込みがあると思っていましたが、それは素晴らしい解決策です。 –

+1

@ T.G。私はそのための特定の機能があるとは思わないが、パフォーマンスを改善する必要がある場合は、 'data.table'または' dplyr'パッケージを使用してconsidereを実行することができます – timat

関連する問題