2017-01-24 9 views
3

私は別の値のベクトルを持っている、と私はマージと5が3合流する2つの連続した値

入力が続いている場合は一緒に2つの値を追加したい:

vector <- c(1, 2, 7, 4, 3, 8, 5, 3, 2, 6, 9, 4, 4, 5, 6, 2, 6, 5, 3) 

の予想される出力:

1 2 7 4 3 8 8 2 6 9 4 4 5 6 2 6 8 

だから、あなたが見ることができるように、5次の三つの2つの出現は、私はほんの数秒でこれを行います簡単な関数があると確信している8を表示するために一緒に追加されました、私はちょうどなかったそれを見つけることができます。

ありがとうございます!

答えて

9
vector <- c(1, 2, 7, 4, 3, 8, 5, 3, 2, 6, 9, 4, 4, 5, 6, 2, 6, 5, 3) 

# get indices where 5 followed by 3 
fives <- head(vector, -1) == 5 & tail(vector, -1) == 3 

# add three to fives 
vector[fives] <- vector[fives] + 3 

# remove threes 
vector <- vector[c(TRUE, !fives)] 
vector 
# [1] 1 2 7 4 3 8 8 2 6 9 4 4 5 6 2 6 8 
+0

これは、データフレームのために使用することができますか?私は9列と約10,000行のデータフレームを持っており、列に5が続き、3がある場合は2行を結合したいと考えています – useR

+0

これをすべての列に個別に適用するか、すべての列に適用しますか1つの列に基づいて?たぶんもっと明白な例を与えることができます。 – Psidom

+0

重要な列はID、Matchtime、Scoreevent、およびaccumulationscoreです。 Scoreeventには、-9〜9までの異なる番号が含まれています。蓄積されたスコアはIDが変わるまでスコアを蓄積し、ScoreeventとAccumulatedスコアの両方がゼロにリセットされます。私がしたいのは、Scoreeventの列に5が2つ続いた場合、2つのそれぞれの行をマージすることです。 5つの行にIDが123、Matchtimeが2053、Scoreeventが5、累積スコアが17の行がある場合、IDが123、Matchtimeが2117、Scoreeventが3、accumscoreが20です。 – useR

4

ここで1つの可能性である:

x <- c(1, 2, 7, 4, 3, 8, 5, 3, 2, 6, 9, 4, 4, 5, 6, 2, 6, 5, 3) 

A <- rbind(x[-length(x)], x[-1]) 
id <- which(colSums(abs(A - c(5, 3))) == 0) 

x[rbind(id, id + 1L)] <- c(8, NA) 
na.omit(x) 

このソリューションは、それが簡単に、一般的なケースに拡張することが提案された(それは最高のOPのニーズを満たしていないかもしれませんが、私はちょうど練習としてそれをやったが、 。一般的には)

、あなたはベクトルxでチャンクxcを一致させたい場合は、私たちが行うことができます。

A <- t(embed(x, length(xc))) 
id <- which(colSums(abs(A - rev(xc))) == 0) 

idは、一致するチャンクの開始インデックスをxにします。

0
vector <- c(1, 2, 7, 4, 3, 8, 5, 3, 2, 6, 9, 4, 4, 5, 6, 2, 6, 5, 3) 
temp = rev(which((vector == 5) & (vector[-1] == 3))) # find indexes of 5s followed by 3s 

for (t in temp){ 
    vector = vector[-(t+1)] # remove threes 
    vector[t] = 8    # replace fives with eights 
} 
vector 
# [1] 1 2 7 4 3 8 8 2 6 9 4 4 5 6 2 6 8 
関連する問題