2016-11-22 1 views
2

私は、指定された誤差の範囲で測定値を含むRの2つ以上のデータフレームを結合(またはおそらくマージ)する方法を探しています。つまり、「by」列の値はnnn.nnnn +/- 0.000nになります。エラー許容値は、値の3〜6倍に制限されています。エラー範囲の測定値によるデータフレームの結合

これは今まで私の最高の試みです。

newDF < - left_join(P0511_480k、P0511_SF00V、= Cによる(P0511_480k $ MZ ==(P0511_SF00V $ MZ - 0.000003(P0511_480k $ MZ)):(P0511_SF00V $ MZ + 0.000003(P0511_480k $ MZ))))

この式では、2つのデータフレーム(P0511_480kとP0511_SF00V)があり、それらを "mz"という列でマージしたいと考えています。値の許容範囲は、正または負の "m.z"倍0.000003です。たとえば、P0511_480k_subset $ m.z = 187.06162は、P0511_SF00V_subset $ m.z = 187.06155と一致する必要があります。

> dput(head(P0511_480k_subset, 10)) 
structure(list(m.z = c(187.06162, 203.05652, 215.05668, 217.07224, 
279.05499), Intensity = c(319420.8, 288068.9, 229953, 210107.8, 
180054), Relative = c(100, 90.18, 71.99, 65.78, 56.37), Resolution = c(394956.59, 
415308.31, 387924.91, 437318.31, 410670.91), Baseline = c(2.1, 
1.43, 1.69, 1.73, 3.04), Noise = c(28.03, 27.17, 27.52, 27.58, 
29.37)), .Names = c("m.z", "Intensity", "Relative", "Resolution", 
"Baseline", "Noise"), class = c("tbl_df", "data.frame"), row.names = c(NA, 
-5L)) 

> dput(head(P0511_SF00V_subset, 10)) 
structure(list(m.z = c(187.06155, 203.05641, 215.05654, 217.0721 
), Intensity = c(1021342.8, 801347.1, 662928.1, 523234.2), Relative = c(100, 
78.46, 64.91, 51.23), Resolution = c(314271.88, 298427.41, 289803.97, 
288163.63), Baseline = c(6.89, 10.47, 9.13, 8.89), Noise = c(40.94, 
45.98, 44.3, 44.01)), .Names = c("m.z", "Intensity", "Relative", 
"Resolution", "Baseline", "Noise"), class = c("tbl_df", "data.frame" 
), row.names = c(NA, -4L)) 

私はあなたの提案に感謝!私はできるだけ広範囲にヘルプドキュメントを検索し、私が必要とするものに近い例を見つけることができませんでした。

多くの感謝!

+0

'dput()'または 'dput(head(df、20)) 'を使ってデータ(またはそのサブセット)を入力してください。また、乗算を行うときには(*がカッコの前にあっても) '*'を指定する必要があります。 – etienne

+0

[* fuzzyjoin *パッケージ](https://github.com/dgrtwo/fuzzyjoin)をチェックしてください。 dplyrの結合操作のバリエーションです。 – aosmith

+0

私は 'data.table :: foverlaps()'のようなものが必要だと思います。データと期待される出力を提供します。 – zx8754

答えて

0

一致しない行が必要ない場合は、これが機能します。 2つのデータセットがdf1およびdf2であると仮定する。 df1のm.z列を調べ、df2のm.z列の任意の値の0.000003の許容値内であれば、df1のその値をdf2の対応する一致した値に置き換えます。次に、2つのデータフレームをマージします。

df1$m.z <- sapply(df1$m.z, function(x) 
       { 
        # First check if the element lies within tolerance limits of any element in df2 
        ifelse(min(abs(df2$m.z - x), na.rm=TRUE) < 0.000003 * x, 
        # If yes, replace that element in df1 with the matching element in df2 
        df2[which.min(abs(df2$m.z - x)),"m.z"], 0) 
       }) 
df3 <- merge(df1, df2) 
+0

はい、しかしサプライmz値をリストに変換します。 –

+0

だから、 "df1 $ m.z < - as.numeric(df1 $ m.z)"を追加しました。それは動作するように見えますが、これは私がマージする5つのデータフレームを持っていることを考えると、プロセスが厄介です。 –

+0

私は参照してください。私はそれが幾分面倒かもしれないことに同意するが、私はforループまたは5データフレームのlapplyを使用します。 –

関連する問題