首页 > 解决方案 > 循环内的下标越界

问题描述

我是 R 新手,遇到了问题。我正在尝试根据另一个数据帧(“razdeljena1”)中的数据填充矩阵(“m”) - 所有列和行名称或“m”都与“razdeljena1”中第一列和第二列中的名称匹配”。

m <- matrix(1:729, byrow = TRUE, nrow = 27,
            dimnames = list(c("PES", "MAčKA", "VTÁK","HORA","STROM","RIEKA","SLNKO","MÄSO","SYR","VODA","CHLIEB","KLADIVO","METLA","PERO","NÔŽ","POSTEĽ","STÔL","SKRIŇA","LAMPA","TOPÁNKA","NOHAVICE","KLOBÚK","DÁŽDNIK","VEDRO","FĽAŠA","VRECE","KONZERVA"),
                            c("PES", "MAčKA", "VTÁK","HORA","STROM","RIEKA","SLNKO","MÄSO","SYR","VODA","CHLIEB","KLADIVO","METLA","PERO","NÔŽ","POSTEĽ","STÔL","SKRIŇA","LAMPA","TOPÁNKA","NOHAVICE","KLOBÚK","DÁŽDNIK","VEDRO","FĽAŠA","VRECE","KONZERVA")))
m <- replace(m, 1:729, NA)

这是前 12 个观察结果razdeljena1

       1          2          rating.response
  [1,] "SYR"      "KLADIVO"  "1"            
  [2,] "LAMPA"    "DÁŽDNIK"  "1"            
  [3,] "CHLIEB"   "KLOBÚK"   "1"            
  [4,] "STROM"    "KONZERVA" "1"            
  [5,] "PERO"     "NÔŽ"      "1"            
  [6,] "STÔL"     "DÁŽDNIK"  "1"            
  [7,] "STROM"    "VODA"     "1"            
  [8,] "DÁŽDNIK"  "KONZERVA" "1"            
  [9,] "PERO"     "POSTEĽ"   "1"            
 [10,] "HORA"     "VODA"     "1"            
 [11,] "LAMPA"    "FĽAŠA"    "1"            
 [12,] "STROM"    "SKRIŇA"   "1"     

为此,我创建了一个 while 循环,它将读取每一行并提取必要的信息并将其写入矩阵。

a <- 1
while (a <379){
  beseda1 <- razdeljena1[a,1]
  beseda2 <- razdeljena1[a,2]
  relat <- razdeljena1[a,3]

  m[beseda1, beseda2] <- relat
  m[beseda2, beseda1] <- relat

  a <- a+1
}

该循环在前 9 次迭代中运行良好(并正确写入矩阵),然后返回一个Error in [<-(*tmp*, beseda1, beseda2, value = relat) : subscript out of bounds.错误- 但是:当我尝试访问循环外的单元格(具有相同定义的坐标)时,它实际上返回了正确的单元格。

示例:错误发生时beseda1 = "PERO"beseda2 = "POSTEĽ"; 但是,当我尝试在循环之外更改它时,它工作得很好:

beseda1 <- "PERO"
beseda2 <- "POSTEĽ"

m[beseda1, beseda2] <- 1
m[beseda2, beseda1] <- 1

我还尝试查看这是否是唯一会导致问题的对(通过启动一个大于 9 的数字循环)并在一些迭代后得到相同的错误。

标签: r

解决方案


R 支持通过包含暗名称的两列字符矩阵进行赋值索引;不需要循环。只需这样做:

 m[ razdeljena1[ , 1:2] ] <- razdeljena1[ , 3]

证明您提供的小示例数据成功:

> m [ razdeljena1[ , 1:2] ] <- razdeljena1[,3]
> m
         PES MAčKA VTÁK HORA STROM RIEKA SLNKO MÄSO SYR VODA CHLIEB KLADIVO METLA PERO NÔŽ
PES      NA  NA    NA   NA   NA    NA    NA    NA   NA  NA   NA     NA      NA    NA   NA 
MAčKA    NA  NA    NA   NA   NA    NA    NA    NA   NA  NA   NA     NA      NA    NA   NA 
VTÁK     NA  NA    NA   NA   NA    NA    NA    NA   NA  NA   NA     NA      NA    NA   NA 
HORA     NA  NA    NA   NA   NA    NA    NA    NA   NA  "1"  NA     NA      NA    NA   NA 
STROM    NA  NA    NA   NA   NA    NA    NA    NA   NA  "1"  NA     NA      NA    NA   NA 
#snipped remaining rows.

推荐阅读