【问题标题】:Need help working with Matrices in R需要帮助在 R 中使用矩阵
【发布时间】:2013-05-23 06:12:54
【问题描述】:

所以现在写,我正在用 R 编写一个函数,它查看一组表示为矩阵的向量和两个测试向量,然后检查原始集合中的每个向量,并确定它是两个测试向量中的哪一个更接近(或两者都不),然后将三个数据集作为矩阵输出(向量更接近第一个测试,第二个测试,两者都不)。我写了另一个函数,它只查看三个向量,然后给出第一个向量更接近哪个向量作为输出(这是更接近的函数)。它及其结果被用于新函数中。

这是更大功能的代码:

vectorwork <- function(mat,test1,test2){
  closer1 = ()
  closer2 = ()
  neither = ()
  y = dim(mat)[2]
  for(i in 1:(dim(mat)[1]){
    if(closer(mat[i,],test1,test2)==1){
      closer1[length(closer1)+1] = mat[i,]
    }
    else if(closer(mat[i,],test1,test2)==2){
      closer2[length(closer2)+1] = mat[i,]
    }
    else{
      neither[length(neither)+1] = mat[i,]
    }
  }
  close1 = matrix(closer1, (length(closer1)/y), y)
  close2 = matrix(closer2, (length(closer2)/y), y)
  neith = matrix(neither, (length(neither)/y), y)
print(close1,close2,neith)
}

我在整个代码中不断收到括号错误。由于我是 R 新手,所以我不确定我到底哪里出错了。任何帮助将不胜感激!

【问题讨论】:

    标签: r vector matrix parentheses


    【解决方案1】:

    R 的基本原理之一是它使用向量。这意味着您可以通过简单的== 比较对两个向量进行逐个元素的比较:

    x==a
    

    所以,试试这个吧:

    set.seed(1)
    x <- sample(1:5, 10, replace=TRUE)
    a <- sample(1:5, 10, replace=TRUE)
    b <- sample(1:5, 10, replace=TRUE)
    
    sum(x==a)
    [1] 1
    sum(x==b)
    [1] 2
    

    要进行最后一次比较,请将逻辑 AND 运算符 &amp; 放在评估中:

    sum(x!=a & x!=b)
    [1] 7
    

    【讨论】:

    • 这绝对有助于清理 for 循环部分,但我得到的错误是 Error: unexpected '{' in: " for(i in 1:(dim(mat)[1]) {" 这似乎会导致所涉及的其他错误。出于某种原因,它在函数的开头有一个语法(我认为)问题。我将使用你的方法来清理 for 循环,不过。
    • 带有“FOR”的行有 3 个左括号和 2 个右括号,因此如果找到左卷曲,它可能会期待第三个右括号。
    • 谢谢,就是这样。我从头开始重新编写它,并且修复了它。
    【解决方案2】:

    您的问题是括号不平衡。

      for(i in 1:(dim(mat)[1])     {
         ^       ^   C   C   ^    <--- innermost pair
         |       B           B    <- middle pair
         A                        <- outermost one is unpaired 
    

    这是基本的。数一数!

      for(i in 1:(dim(mat)[1]) ) {
                               ^
                               |
                            put it in
    

    问题是,从您的帖子 ("paren errors") 和 cmets ("Error: unexpected '{' in: " for(i in 1:(dim(mat) [1]) {"),看起来您显然已经知道问题出在哪里,并且您显然已经知道问题出在哪一行。鉴于此,您需要做的就是数到三。

    这是我在检查括号时使用的一个小技巧;当我阅读时,我在击中每个“(”时数“1”,“2”。然后当我击中“)”时,我再次减去,随着我击中更多的“(”和“)”而上下移动。当我到达所有应该关闭的地方时,我最好打到 0

    考虑你的违规行。计数必须在 "{" 之前达到零!是吗?

      for(i in 1:(dim(mat)[1])     { 
         1       2   3   2   1     Nope. I'm short a ")".
    

    这通常不会找到插入缺失的确切位置,但它很快表明您肯定有问题,然后通常很容易找到。

    【讨论】:

    • 嘿,我的parens真的很糟糕......我上下看了八次,找不到我的错误所在。谢谢。
    • 开始使用像 RStudio 这样的 IDE,它会显示匹配的括号(如果您键入左括号,实际上会插入一个右括号)。
    • @Roland 我使用 Rstudio,但对我来说,它会引起与保持括号和引号平衡所解决的问题一样多的问题。如果您只从左到右键入并且永远不需要返回插入内容,或者想要在键入开引号之前插入结束引号,那就太好了。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-19
    • 2015-06-14
    • 1970-01-01
    • 2022-10-15
    相关资源
    最近更新 更多