R使用带索引的apply

R使用带索引的apply,r,matrix,indexing,apply,R,Matrix,Indexing,Apply,我有一个单词列表和它们各自的长度。我使用adist()生成单词之间的相似性矩阵。现在我想用长度来划分相似性,所以我需要在每对单词之间创建一个“平均长度”矩阵。如何使用apply()执行此操作?在Excel中,我会将长度列表放在第一列,并将其转置粘贴到第一行。然后将每个单元格计算为各个值(第一行和第一列)之间的平均值。但我还没有找到如何处理apply()中的类似项。有什么想法吗?提前谢谢 一个可重复的例子: lengths <- round(rnorm(10,20,10)) #suppose

我有一个单词列表和它们各自的长度。我使用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

长度您只需要一些矩阵计算。我也要去掉矩阵中的
nan
s(第一列和第一行)。你不需要它们,是吗

> 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
>vm(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

您只需要一些矩阵计算。我也要去掉矩阵中的
nan
s(第一列和第一行)。你不需要它们,是吗

> 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
>vm(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

如果要使用应用:

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

如果要使用“应用”,请执行以下操作:

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

“请提供一张支票。在这里,”托马斯说。非常感谢。“请提供一张支票。在这里,”托马斯说。非常感谢。非常巧妙!它工作得很好。谢谢!但问题仍然在于如何将apply()与两个索引一起使用……当然,这可以通过
sapply(1:10,函数(i)(v+v[i])/2)
来完成。给你同样的矩阵。与应用相同(矩阵(1:10),1,函数(i)(v+v[i])/2)
,只是读起来更好。非常巧妙!它工作得很好。谢谢!但问题仍然在于如何将apply()与两个索引一起使用……当然,这可以通过
sapply(1:10,函数(i)(v+v[i])/2)
来完成。给你同样的矩阵。与应用相同(矩阵(1:10),1,函数(i)(v+v[i])/2),只是读起来更好。对mee来说仍然有点“神秘”,但我正在慢慢理解它。谢谢我还是有点“神秘”,但我正在慢慢理解。谢谢