遍历列表或R中的矩阵

时间:2020-07-24 20:51:10

标签: r loops matrix

Mfrq是608 x 10的矩阵,list.ids是608个用户的列表,每个列表中有10个项目。 我试图找到矩阵中每两行之间或列表中每两个向量之间的距离。 我期望输出为608 x 608并带有距离的矩阵。 附件中的代码是我一直在运行以及我收到的错误。

<This is for the list>
rnext=row+1
for (row in 1:length(list.ids)){
  Wdist=as.matrix(wasserstein1d(list.ids[[row]],list.ids[[rnext]]))
  row=rnext
}

这有效,但只给了我一个价值。

<the value>
 Wdist
         [,1]
[1,] 2.585177

对于矩阵,我有:

i=1:nrow(Mfrq)
sapply(Mfrq, function(x) as.matrix({wasserstein1d(x[i,],x[i+1,])}) )

,错误为

Error in x[i, ] : incorrect number of dimensions

我的矩阵看起来像

head(Mfrq)
             [,1]      [,2]      [,3]      [,4]      [,5]      [,6]      [,7]      [,8]       [,9]
1029891  3.703704  6.172840  8.641975 24.691358 39.506173  4.938272  4.938272  3.703704  1.2345679
1044051  4.347826  8.695652  8.695652 21.739130 26.086957  4.347826 13.043478  0.000000  8.6956522
1056991  1.538462  0.000000 10.769231  4.615385  7.692308  9.230769  9.230769 33.846154 13.8461538
1069151  0.000000  0.000000  3.703704  3.703704  7.407407 14.814815 11.111111  7.407407 11.1111111
1071801  4.761905 19.047619 14.285714 23.809524  4.761905  9.523810  4.761905  9.523810  4.7619048
1072191 31.417625 29.118774 13.026820  9.578544  9.195402  3.831418  1.149425  1.149425  0.7662835
             [,10]
1029891  2.4691358
1044051  4.3478261
1056991  9.2307692
1069151 40.7407407
1071801  4.7619048
1072191  0.7662835

列表看起来像

$`1029891`
 [1]  3.703704  6.172840  8.641975 24.691358 39.506173  4.938272  4.938272  3.703704  1.234568  2.469136

$`1044051`
 [1]  4.347826  8.695652  8.695652 21.739130 26.086957  4.347826 13.043478  0.000000  8.695652  4.347826

$`1056991`
 [1]  1.538462  0.000000 10.769231  4.615385  7.692308  9.230769  9.230769 33.846154 13.846154  9.230769

$`1069151`
 [1]  0.000000  0.000000  3.703704  3.703704  7.407407 14.814815 11.111111  7.407407 11.111111 40.740741

$`1071801`
 [1]  4.761905 19.047619 14.285714 23.809524  4.761905  9.523810  4.761905  9.523810  4.761905  4.761905

$`1072191`
 [1] 31.4176245 29.1187739 13.0268199  9.5785441  9.1954023  3.8314176  1.1494253  1.1494253  0.7662835
[10]  0.7662835

1 个答案:

答案 0 :(得分:0)

这里有一些问题。首先,如果使用for循环,则不应更改迭代变量。您有:

for (row in 1:length(list.ids)){
  Wdist=as.matrix(wasserstein1d(list.ids[[row]],list.ids[[rnext]]))
  row=rnext
}

您不应在此循环中使用row = rnext

问题:您是否需要计算每两个连续行之间的距离?或者,是否需要为两行的每种组合计算它们?这两个是不同的。

如果要计算每两个连续行之间的距离,则row变量必须从1到9,而rnext变量必须从2到10。

第二个问题是您在此循环中没有保存任何内容:

for (row in 1:length(list.ids)){
  Wdist=as.matrix(wasserstein1d(list.ids[[row]],list.ids[[rnext]]))
  row=rnext
}

您每次迭代都覆盖Wdist

矩阵部分也有类似的问题。