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