2017-08-22 10 views
0

データxとyの2つのベクトルがあります。最初のものが距離で、2番目が温度であるとしましょう。別のベクトルに基づく点の削除

どのように両方xから除去することができるとy二つの連続点(XI - XI-1)との間の下に一定の距離「D」の距離の全ての点

x = (1,2,3,8,12) 
y = (10,12,11,9,12) 

よりも小さい距離で点を削除ここでは5

x = 1, 2(out as 2-1 <5), 3 (out as 3-1 <5), 8, 12 (fine as last even thoug 12-8<5) 
x = (1,8,12) 
y = (10,9,12) 
+2

2つのベクトルに同じ観測値に関する情報が含まれている場合は、それらを 'data.frame'に格納することを検討する必要があります。次に、( 'R''を使うか、' dplyr'の 'filter'のような外部ライブラリの関数を使って)フィルタリングを行います。 –

+0

@imo、今すぐ明らかになりました – ic3

答えて

2

v1 <- setNames(x, y)[c(TRUE, (diff(x) >= 5)[-(length(x)-1)], TRUE)] 
#10 9 12 
# 1 8 12 

#To make it a bit more clear on how the named vector is structured (still a vector) 

names(v1) 
#[1] "10" "9" "12" <- Note: I get 9 whereas you get 11 

unname(v1) 
#[1] 1 8 12 
、あなたの最初と最後の要素が削除されることはありませんと仮定して1つのアイデアがあります

それとも、

rm_elements <- function(x, y, n){ 
    v1 <- setNames(x, y)[c(TRUE, (diff(x) >= n)[-(length(x)-1)], TRUE)] 
    return(list(x = unname(v1), y = as.numeric(names(v1)))) 
} 

rm_elements(x, y, 5) 
#$x 
#[1] 1 8 12 

#$y 
#[1] 10 9 12 

EDIT、その機能することができます:あなたは、データフレームでそれらを持っているとき、我々は、データフレームを受け入れるように機能を少し変更することができますのためにあなたのコメントを対応するために(なし問題あなたは)変数に名前を付け、そのデータフレームのサブセットを返す、つまりどのように与え

rm_elements <- function(df, n){ 
    v1 <- df[c(TRUE, (diff(df[[1]]) >= n)[-(nrow(df)-1)], TRUE),] 
    return(v1) 
} 

#Make a data frame from the vectors, 
d1 <- data.frame(x=x, y=y) 

rm_elements(d1, 5) 

x y 
1 1 10 
4 8 9 
5 12 12 
+0

ありがとう、データフレームのバージョンは同じに見えますか? – ic3

+0

あなたはそれがリストではなくデータフレームを返すようにしたいのですか? – Sotos

+0

xとyをsetNamesの代わりにdata.frame(x、y)でバインドする場合 – ic3

関連する問題