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 回答
0

将数据保留为向量,然后使用基outer函数,只需一步即可产生相同的结果:

y<- c(16.84, 32.23, 8.84, 237.00, 57.92)
> abs(outer(y,y, `-`))
   [,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
于 2020-10-23T16:18:51.157 回答