R使用apply with index

时间:2013-11-19 15:10:12

标签: r matrix indexing apply

我有一个单词列表及其各自的长度。我使用adist()生成单词之间相似的矩阵。现在我想用长度来区分相似性,所以我需要在每对单词之间创建一个“平均长度”的矩阵。我如何用apply()做到这一点?在Excel中,我会将长度列表放在第一列中,并将其粘贴到第一行中。然后将每个单元计算为相应值(第一行和第一列)之间的平均值。但我还没有找到如何解决apply()中的项目。请问有什么想法吗?提前谢谢!

可重现的例子:

lengths <- round(rnorm(10,20,10)) #suppose those are the words' lengths
  [1] 30 25 11  5 24 26 10 16 16  9

m <- matrix(ncol=11,nrow=11)
m[1,2:11] <- lengths
m[2:11,1] <- lengths
m
      [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10] [,11]
 [1,]   NA   30   25   11    5   24   26   10   16    16     9
 [2,]   30   NA   NA   NA   NA   NA   NA   NA   NA    NA    NA
 [3,]   25   NA   NA   NA   NA   NA   NA   NA   NA    NA    NA
 [4,]   11   NA   NA   NA   NA   NA   NA   NA   NA    NA    NA
 [5,]    5   NA   NA   NA   NA   NA   NA   NA   NA    NA    NA
 [6,]   24   NA   NA   NA   NA   NA   NA   NA   NA    NA    NA
 [7,]   26   NA   NA   NA   NA   NA   NA   NA   NA    NA    NA
 [8,]   10   NA   NA   NA   NA   NA   NA   NA   NA    NA    NA
 [9,]   16   NA   NA   NA   NA   NA   NA   NA   NA    NA    NA
[10,]   16   NA   NA   NA   NA   NA   NA   NA   NA    NA    NA
[11,]    9   NA   NA   NA   NA   NA   NA   NA   NA    NA    NA

m[2,2] <- (m[1,2]+m[2,1])/2
m[2,3] <- (m[1,3]+m[2,1])/2
m[2,4] <- (m[1,4]+m[2,1])/2
m

      [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10] [,11]
 [1,]   NA   30 25.0 11.0    5   24   26   10   16    16     9
 [2,]   30   30 27.5 20.5   NA   NA   NA   NA   NA    NA    NA
 [3,]   25   NA   NA   NA   NA   NA   NA   NA   NA    NA    NA
 [4,]   11   NA   NA   NA   NA   NA   NA   NA   NA    NA    NA
 [5,]    5   NA   NA   NA   NA   NA   NA   NA   NA    NA    NA
 [6,]   24   NA   NA   NA   NA   NA   NA   NA   NA    NA    NA
 [7,]   26   NA   NA   NA   NA   NA   NA   NA   NA    NA    NA
 [8,]   10   NA   NA   NA   NA   NA   NA   NA   NA    NA    NA
 [9,]   16   NA   NA   NA   NA   NA   NA   NA   NA    NA    NA
[10,]   16   NA   NA   NA   NA   NA   NA   NA   NA    NA    NA
[11,]    9   NA   NA   NA   NA   NA   NA   NA   NA    NA    NA

我需要一个应用函数来对整个矩阵。但不知道如何索引它。

2 个答案:

答案 0 :(得分:3)

你只需要一些矩阵计算。我也将摆脱矩阵中的nan(第一列和第一行)。你不需要它们,是吗?

> v<-c(30 ,  25 ,  11  ,  5  , 24 ,  26 ,  10  , 16   , 16   ,  9)
> m<-matrix(0,ncol=10, nrow=10)
> (t(m+v)+(m+v))/2
      [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10]
 [1,] 30.0 27.5 20.5 17.5 27.0 28.0 20.0 23.0 23.0  19.5
 [2,] 27.5 25.0 18.0 15.0 24.5 25.5 17.5 20.5 20.5  17.0
 [3,] 20.5 18.0 11.0  8.0 17.5 18.5 10.5 13.5 13.5  10.0
 [4,] 17.5 15.0  8.0  5.0 14.5 15.5  7.5 10.5 10.5   7.0
 [5,] 27.0 24.5 17.5 14.5 24.0 25.0 17.0 20.0 20.0  16.5
 [6,] 28.0 25.5 18.5 15.5 25.0 26.0 18.0 21.0 21.0  17.5
 [7,] 20.0 17.5 10.5  7.5 17.0 18.0 10.0 13.0 13.0   9.5
 [8,] 23.0 20.5 13.5 10.5 20.0 21.0 13.0 16.0 16.0  12.5
 [9,] 23.0 20.5 13.5 10.5 20.0 21.0 13.0 16.0 16.0  12.5
[10,] 19.5 17.0 10.0  7.0 16.5 17.5  9.5 12.5 12.5   9.0

答案 1 :(得分:2)

如果您想使用apply:

lengths = lengths = c(30, 25, 11, 5, 24, 26, 10, 16, 16, 9)
sapply(lengths , function(x){(x + t(lengths ))/2})

输出:

     [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10]
 [1,] 30.0 27.5 20.5 17.5 27.0 28.0 20.0 23.0 23.0  19.5
 [2,] 27.5 25.0 18.0 15.0 24.5 25.5 17.5 20.5 20.5  17.0
 [3,] 20.5 18.0 11.0  8.0 17.5 18.5 10.5 13.5 13.5  10.0
 [4,] 17.5 15.0  8.0  5.0 14.5 15.5  7.5 10.5 10.5   7.0
 [5,] 27.0 24.5 17.5 14.5 24.0 25.0 17.0 20.0 20.0  16.5
 [6,] 28.0 25.5 18.5 15.5 25.0 26.0 18.0 21.0 21.0  17.5
 [7,] 20.0 17.5 10.5  7.5 17.0 18.0 10.0 13.0 13.0   9.5
 [8,] 23.0 20.5 13.5 10.5 20.0 21.0 13.0 16.0 16.0  12.5
 [9,] 23.0 20.5 13.5 10.5 20.0 21.0 13.0 16.0 16.0  12.5
[10,] 19.5 17.0 10.0  7.0 16.5 17.5  9.5 12.5 12.5   9.0