我有一个单词列表及其各自的长度。我使用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
我需要一个应用函数来对整个矩阵。但不知道如何索引它。
答案 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