【问题标题】:lock rows in r as in excel锁定 r 中的行,就像在 excel 中一样
【发布时间】:2016-12-29 09:52:57
【问题描述】:

我正在测试 R,但遇到了一个问题。如何像在 Excel 中一样在 r 中锁定行 [单元格]。

示例:数据集(dff)

   X   Y
  35   1
  18   2
  17   3
  35   4

我想做一个嵌套的 for 循环,我想用 1 添加 35,然后添加 2、3 和 4。一旦这结束了,我将添加 18 和 1、2、3、4 等

为此,我需要分两步完成:

第 1 步: 创建一个存储嵌套 for 循环的矩阵

结果应该是这样的

   X   V1  V2 V3 V4
  35   36  19 18 36
  18   37  20 19 37
  17   38  21 20 38
  35   39  22 21 39

每次我只是简单地将 X 行与 Y 行相加

为此,我编写了这个嵌套的for循环

  step1 = matrix(0, nrow=nrow(dff), ncol = nrow(dff)) #create a placeholder

  for (i in 1:nrow(dff[,1])) # for each row in the first column 
    for (j in 1:nrow(dff[,2])){ # for each row in the second column 
    add[i,j] =  i +j # add them in the placeholder
    }

问题: 我收到一条错误消息:

  Error in 1:nrow(dff[, 1]) : argument of length 0

步骤 2:将步骤 1 列的总和添加到我的原始数据集(dff)

  dff <- cbind(dff, apply(add[,-1], 2,sum) # calculate the column sums of all except the X column, where 2 is refering to column

请更正我的嵌套 for 循环,然后提供其他方法,否则我将永远学不会:) 谢谢

【问题讨论】:

    标签: r for-loop row


    【解决方案1】:

    不要为此使用for 循环。在这里,您可以使用outer,或者最好使用一些简单的数学:

    DF <- data.frame(X = c(35, 18, 17, 35),
                     Y = 1:4)
    outer(DF$Y, DF$X, "+")
    #     [,1] [,2] [,3] [,4]
    #[1,]   36   19   18   36
    #[2,]   37   20   19   37
    #[3,]   38   21   20   38
    #[4,]   39   22   21   39
    
    DF$Z <- colSums(outer(DF$Y, DF$X, "+"))
    DF$Z1 <- nrow(DF) * DF$X + sum(DF$Y)
    #   X Y   Z  Z1
    #1 35 1 150 150
    #2 18 2  82  82
    #3 17 3  78  78
    #4 35 4 150 150
    

    【讨论】:

    • 谢谢,我不会使用 for 循环。但是根据我自己的理解,请看看我的 for 循环并纠正它?我真的需要知道我做错了什么。
    • df[,1] 是一个向量,因此没有行。你想要length(df[,1])
    【解决方案2】:

    我按如下方式创建您的数据框:

    dff <- data.frame(X = c(35, 18, 17, 35), Y = 1:4)
    

    然后我使用sapply() 来获取您作为步骤 1 的结果显示的矩阵。然后可以使用colSums() 计算列的总和:

    mat <- sapply(seq_along(dff$X), function(i) dff$X[i] + dff$Y)
    data.frame(dff, Z = colSums(mat))
    ##    X Y   Z
    ## 1 35 1 150
    ## 2 18 2  82
    ## 3 17 3  78
    ## 4 35 4 150
    

    更正问题中的for循环

    正如 Roland 已经指出的,你的 for 循环的主要错误是你甚至试图用 for 循环来解决这个问题。但是如果你绝对想用循环来做它是可能的。您的循环有几个问题,我不会全部讨论。只需将以下内容与您的循环进行比较:

    step1 = matrix(0, nrow=nrow(dff), ncol = nrow(dff)) #create a placeholder
    for (i in 1:nrow(dff)) {# for each row in the first column 
      for (j in 1:nrow(dff)) { # for each row in the second column 
        step1[i, j] <-  dff$Y[i] + dff$X[j] # add them in the placeholder
      }
    }
    

    【讨论】:

    • 感谢您的回答。请看看我的for循环并纠正它吗?我真的需要知道我做错了什么。
    • sapply(dff$X, function(x) x + dff$Y) 对于第 1 步来说应该足够了。不是吗?
    • @RonakShah 是的,这将给出相同的结果。
    猜你喜欢
    • 2018-03-27
    • 1970-01-01
    • 1970-01-01
    • 2011-06-09
    • 2021-06-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多