函数lapply错误:下标超出范围

时间:2019-02-16 17:24:04

标签: r

我必须为一个项目制作一张4 * 4的Kohonen地图。

但是,我得到了错误

  

win_index [1,]错误:下标超出范围

     

另外:有16条警告(使用警告()查看它们)

在测试我的代码之后,我猜想它不是lapply函数(第77行) 由于创建的矩阵仅包含NA,因此无法正确执行。 因此,由于此矩阵稍后使用,因此结果不正确,因为 整个程序中都没有NA。

#############################################
##Function for distance calculation (RMSDA)##
#############################################

RMSDA<-function(data_phipsi,Kohonen_matrix)
{
  difference<-data_phipsi-Kohonen_matrix 
  for(j in 1:length(difference)){
    if (difference[j]< -180) {difference[j]=difference[j]+360}
    if (difference[j]> +180) {difference[j]=difference[j]-360}
  }
  distance=mean(sqrt(difference^2))  
  return(distance) 
}

##############################
## Program ###
##############################

for(step in 1:iteration)
{
  data_phipsi<-data_phipsi[sample(nrow(data_phipsi)),] # Sample vectors of training (samples of lines of the dataframe)
  print(step) #Visualize where we are in loops
  for(k_row in 1:nrow(data_phipsi))
  {
    #Update learn_rate and radius at each row of each iteration
    learn_rate<-learning(initial_rate,((step-1)*nrow(data_phipsi))+k_row,data_phipsi)
    learn_radius<-learning(initial_rate,((step-1)*nrow(data_phipsi))+k_row,data_phipsi)
    #Find distance between each vectors of angles of Kohonen Map and the training vector
    phipsi_RMSDA<-lapply(random_list, RMSDA, data_phipsi=data_phipsi[k_row,])
}

如何解决这个错误的错误?

谢谢。谢谢。

edit:对于lapply来说,这些是唯一有用的元素

对于随机列表,我们可以使用:

random_list <- list(
  c(88, 148, 60, 83, -119, -59, -96, 169),
  c(104, 101, 174, -48, 18, 10, -159, 158),
  c(164, -80, 137, -170, -172, 52, -149, 96),
  c(88, 18, -115, 48, -3, -158, -92, -154),
  c(170, -107, -109, -14, -142, -77, -120, 76),
  c(-121, 15, -46, -145, -128, 74, -166, 44),
  c(46, -178, 67, -88, -125, -130, 88, -11),
  c(131, 147, -32, 103, -16, 116, 78, -125),
  c(75, -95, -137, 133, -97, -134, 126, -105),
  c(115, 173, -82, -135, 134, 82, -143, -43),
  c(111, 13, -54, -53, 103, 132, -13, -43),
  c(-143, 89, -91, -137, -63, 14, -166, 83),
  c(-98, 178, 14, -80, -122, -25, 19, 117),
  c(-113, -97, 34, -178, -56, 18, -167, 84),
  c(49, 82, 50, 168, -157, -154, 51, 78),
  c(173, -4, 164, 125, 31, 115, -74, -92)
)

和一个例子 data_phipsi [1,]

data_phipsi <- read.table(header = TRUE, text = "
 phi1 psi2 phy2 psi3 phy3 psi4 phy4 psi5  
-24.5 81.9 -155.2 -81.4 127.7 -118 166 -82.1")
data_phipsi
#    phi1 psi2   phy2  psi3  phy3 psi4 phy4  psi5
# 1 -24.5 81.9 -155.2 -81.4 127.7 -118  166 -82.1

1 个答案:

答案 0 :(得分:0)

主要问题是后续命令(如果感兴趣,请在问题编辑中返回win_index代码行),因为怀疑来自lapply的结果。

发现问题的故障排除:

  • 当错误出现时,random_listdata_phipsi[k_row,]的值都是合理的,并不值得怀疑;
  • 但是,lapply的输出全部为NA

因此,深入研究功能RMSDA时,发现difference看起来一直很好,直到

distance=mean(sqrt(difference^2))  

这时它变成了全{NA。问题在于数据仍然以帧的形式出现,因此mean失败了(只需尝试mean(mtcars)即可看到)。 (还应注意,我相信sqrt(difference^2)等同于abs(difference)。)

用{p>代替RMSDA的那一行

distance=mean(abs(unlist(difference)))

似乎已解决了该问题(关键部分是unlist)。