2017-01-21 16 views
0

2つのベクトルの間の値のマッチングについて質問があります。等しくないベクトルとIDの公差との交差

data.frame 
    value name      vector 2 
154.0031 A       154.0084 
154.0768 B       159.0344 
154.2145 C       154.0755 
154.4954 D       156.7758 
156.7731 E 
156.8399 F 
159.0299 G 
159.6555 H 
159.9384 I 

今、私は調整可能である定義されたグローバル許容値(例えば+ -0.005)でデータフレームに値を持つベクトル2を比較し、対応する名前を追加したい: は、私は、ベクトルおよびデータフレームを持っているとしましょう2のベクトルなので、私はこのような結果を得るために:

data.frame 
    value name      vector 2 name 
154.0031 A       154.0074 A 
154.0768 B       159.0334 G 
154.2145 C       154.0755 B 
154.4954 D       156.7758 E 
156.7731 E 
156.8399 F 
159.0299 G 
159.6555 H 
159.9384 I 

私はintersect()を使用しようとしたが、それ公差のためのオプションがありませんか?

多くの感謝!

答えて

1

この結果は、outer,whichでサブセット化することで達成できます。

# calculate distances between elements of each object 
# rows are df and columns are vec 2 
myDists <- outer(df$value, vec2, FUN=function(x, y) abs(x - y)) 


# get the values that have less than some given value 
# using arr.ind =TRUE returns a matrix with the row and column positions 
matches <- which(myDists < 0.05, arr.ind=TRUE) 

data.frame(name = df$name[matches[, 1]], value=vec2[matches[, 2]]) 
name value 
1 A 154.0084 
2 G 159.0344 
3 B 154.0755 
4 E 156.7758 

これはvec2の要素と一致する要素のみを返し、閾値を満たすdfの要素をすべて返します。

、これまでの結果は堅牢に現在

# get closest matches for each element of vec2 
closest <- tapply(matches[,1], list(matches[,2]), min) 

# fill in the names. 
# NA will appear where there are no obs that meet the threshold. 
data.frame(name = df$name[closest][match(as.integer(names(closest)), 
             seq_along(vec2))], value=vec2) 

を使用するには、これは、上記と同じ結果を返しますが、DFには十分な観測がないところのNAを返します。

データ

あなたが将来的に質問をする場合には再生可能なデータを提供してください。下記参照。

df <- read.table(header=TRUE, text="value name 
154.0031 A 
154.0768 B 
154.2145 C 
154.4954 D 
156.7731 E 
156.8399 F 
159.0299 G 
159.6555 H 
159.9384 I") 

vec2 <- c(154.0084, 159.0344, 154.0755, 156.7758) 
+0

ありがとうございました。データのことを聞いて、将来の質問に適したデータセットを提供します。 – JmO