下标超出循环范围

时间:2020-02-01 19:03:06

标签: r

我是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)

这是razdeljena1中的前12个观测值

       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的数字开始while循环)并在某些迭代后得到相同的错误。

1 个答案:

答案 0 :(得分:0)

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.