在R中的这短短的一行代码中有什么问题

qcbq4gxm  于 2023-11-14  发布在  其他
关注(0)|答案(3)|浏览(103)

我在R中有一个m × 23的矩阵'temp',假设m=100。当我运行下面的短代码时,我得到错误“Error in temp[i,2:23]:subscription out of bounds”
在控制台中,当我检查j和i的值时,我分别得到1和101。这告诉我索引超过了100,但我看不出这个命令有什么错误。

for(j in 1:nrow(temp)-1){
    for(i in j+1:nrow(temp)){
      if(identical(temp[j,2:23],temp[i,2:23])){
      #Do something
       }
     }
    
   }

字符串
目标:目标是计算矩阵中每个唯一行的数量(计算重复行)。我相信可能有一个更简单的方法来做到这一点,我将感谢任何建议。谢谢
我尝试一次执行一个循环,错误似乎发生在我添加if语句时。

2mbi3lxu

2mbi3lxu1#

问题发生在语句j+1:nrow(temp)处,应该是(j+1):nrow(temp)
两个表达式肯定会给出给予不同的输出。

> (2 + 1):5
[1] 3 4 5

> 2 + 1:5
[1] 3 4 5 6 7

字符串
读取precedence of operators in R时,您将看到:的优先级高于加法+


的数据

eulz3vhy

eulz3vhy2#

也可能是围绕第一个for-语句:

d <- mtcars[1:5, ]
for (i in 1:nrow(d) - 1) {
  print(i)
}
#> [1] 0
#> [1] 1
#> [1] 2
#> [1] 3
#> [1] 4
for (i in 1:(nrow(d) - 1)) {
  print(i)
}
#> [1] 1
#> [1] 2
#> [1] 3
#> [1] 4

字符串
创建于2023-11-09带有reprex v2.0.2

3lxsmp7m

3lxsmp7m3#

内部循环的逻辑实际上是1:nrow(iris)-1 + 1:nrow(iris)。将cat(j,i,"\n")作为#do来观察输出。
R有一个内置的方法来识别重复的行:
duplicated()标识第二个(第三个等)重复(不是第一个观察,因为那个不是重复;但您可以fromLast反向进行)

?duplicated
duplicated(iris)
table(duplicated(iris))

iris[duplicated(iris),]
iris[duplicated(iris, fromLast = TRUE),] #

字符串

相关问题