1

グループ化されたデータから作成したベクトルがあります。

sitesMODE
FT         KM         KO         LN         LY 
16.840000  32.230769   8.846154 237.000000  57.923077

各値とすべての値の違いを見つけ、最終的にそれを単一のオブジェクトまたは列にレポートして、プロットできるようにしたいと考えています。

ここでデータを再現します(マトリックス形式ではありますが):

siteMODE <- matrix(c(16.84, 32.23, 8.84, 237.00, 57.92), 1, 5, byrow = TRUE)
colnames(siteMODE) <- c("FT", "KM", "KO", "LN", "LY")

私は使用できることを知っています:

diffMODELY <- abs(siteMODE - siteMODE[[5]])

表現された列/要素の違いを見つけて、次の[[n]]ようにします。

diffMODELY 
FT        KM        KO        LN        LY 
41.08308  25.69231  49.07692 179.07692   0.00000 

diffMODELY私の質問は今、すべての列/要素の違いのようにオブジェクトを作成する必要なく、どうすればこれを行うことができますか? また、結果を単一のオブジェクトまたはマトリックスの列としてレポートするにはどうすればよいですか?

4

3 に答える 3

1

このようなものをお探しですか?

DIFF <- sapply(1:ncol(siteMODE), function(i) abs(siteMODE - siteMODE[i]))
DIFF[upper.tri(DIFF)]
 [1]  15.39   8.00  23.39 220.16 204.77 228.16  41.08  25.69  49.08 179.08

このsapply部分は必要な差を計算しますが、結果の差をベクトルにしたいので、上三角行列要素または下三角行列要素のいずれかを選択することができます。upper.triそのため、関数を適用して上三角行列のみを選択しました。三角要素と最終結果はベクトルです。

于 2012-11-07T08:58:56.817 に答える
0

を使用した簡単なソリューションsapply:

res = sapply(siteMODE, function(x) abs(x - siteMODE))
> res
       [,1]   [,2]   [,3]   [,4]   [,5]
[1,]   0.00  15.39   8.00 220.16  41.08
[2,]  15.39   0.00  23.39 204.77  25.69
[3,]   8.00  23.39   0.00 228.16  49.08
[4,] 220.16 204.77 228.16   0.00 179.08
[5,]  41.08  25.69  49.08 179.08   0.00

名前の追加:

colnames(res) = colnames(siteMODE)
rownames(res) = colnames(siteMODE)
> res
       FT     KM     KO     LN     LY
FT   0.00  15.39   8.00 220.16  41.08
KM  15.39   0.00  23.39 204.77  25.69
KO   8.00  23.39   0.00 228.16  49.08
LN 220.16 204.77 228.16   0.00 179.08
LY  41.08  25.69  49.08 179.08   0.00

素敵なフラット データ構造を作成します。

require(reshape)
res_flat = melt(res)
# Eliminate duplicates
res_flat = res_flat[melt(upper.tri(res))$value,]
> res_flat
   X1 X2  value
6  FT KM  15.39
11 FT KO   8.00
12 KM KO  23.39
16 FT LN 220.16
17 KM LN 204.77
18 KO LN 228.16
21 FT LY  41.08
22 KM LY  25.69
23 KO LY  49.08
24 LN LY 179.08
于 2012-11-07T09:00:48.380 に答える