【问题标题】:While Loop in R with For-Loop InsideR中的while循环,里面有for循环
【发布时间】:2019-01-13 20:39:54
【问题描述】:

我有一个如下的数据框:

Col1     Col2 
   1        5
   2        6
   3        6

我想写一个while循环来找到最小和,在新列中为该行加1,直到新列总和为5。每行有一个最小值,就加1。

例如:

Col1     Col2    Col1&Col2_sum     New_Value
   1        5                6             1
   2        6                8             0 
   3        6                9             0

现在将 5 添加到 col1 的第一行,因为 6 是最小值。

Col1     Col2    Col1&Col2_sum     New_Value
   6        5               11             1
   2        6                8             1 
   3        6                9             0

现在将 5 添加到第二个,因为 8 是最小值。

Col1     Col2    Col1&Col2_sum     New_Value
   6        5               11             1
   7        6               13             1 
   3        6                9             1

现在将 5 添加到第三个,因为 9 是最小值。

Col1     Col2    Col1&Col2_sum     New_Value
   6        5               11             2
   7        6               13             1 
   8        6               14             1

现在将 5 添加到第一个,因为 11 是最小值。 (最终输出)

Col1     Col2    Col1&Col2_sum     New_Value
  11        5               16             2
   7        6               13             2 
   8        6               14             1

【问题讨论】:

    标签: r for-loop while-loop apply


    【解决方案1】:

    我使用 R 进行了尝试。我之前的答案是在 Python 中。 该程序看起来非常基本,因为我不是 R 程序员,但仍然尝试了一下。至少它会帮助 R 的新手(希望如此)。 注意:代码可能是 R 编程方式的厌恶。

    process_dframe <- function(){
    
        col1 = c(1, 2, 3)
        col2 = c(5, 6, 6)
        new_value = c(0, 0, 0)
        dframe <- data.frame(col1, col2, new_value)
        print(dframe)
    
        new_val_col_sum <- 0
        col1_increment <- 5
        size <- length(dframe$col1)
        print(size)
        while(new_val_col_sum < 5) {
            if(new_val_col_sum > 0) {
                dframe$col1[min_row] <- sum(dframe$col1[min_row], col1_increment)
            }
            min_sum <- as.integer(.Machine$integer.max)
            min_row <- 0
            for(i in 1:size) {
                crnt_sum <- sum(dframe$col1[i], dframe$col2[i])
                if(crnt_sum < min_sum) {
                    min_sum <- crnt_sum
                    min_row <- i
                }
            }
            dframe$new_value[min_row] <- sum(dframe$new_value[min_row], 1)
            new_val_col_sum <- sum(new_val_col_sum, 1)
        }
        return(dframe)
    }
    
    d <- process_dframe()
    print(d)
    

    输出 col1 col2 new_value 1 1 5 0 2 2 6 0 3 3 6 0 [1] 3 col1 col2 new_value 1 1 5 1 2 2 6 0 3 3 6 0 col1 col2 new_value 1 6 5 1 2 2 6 1 3 3 6 0 col1 col2 new_value 1 6 5 1 2 7 6 1 3 3 6 1 col1 col2 new_value 1 6 5 2 2 7 6 1 3 8 6 1 col1 col2 new_value 1 11 5 2 2 7 6 2 3 8 6 1

    【讨论】:

      【解决方案2】:

      以下重现了您的预期输出和中间结果

      # Initialise and pre-alloc memory
      df$`Col1&Col2_sum` <- 0
      df$New_Value <- 0
      
      # while loop
      while (sum(df$New_Value) < 5) {
          df$`Col1&Col2_sum` <- rowSums(df[, 1:2])
          df$New_Value <- df$New_Value + (df$`Col1&Col2_sum` == min(df$`Col1&Col2_sum`))
          print(df)
          idx <- which.min(df$`Col1&Col2_sum`)
          df$Col1[idx] <- df$Col1[idx] + 5
      }
      #  Col1 Col2 Col1&Col2_sum New_Value
      #1    1    5             6         1
      #2    2    6             8         0
      #3    3    6             9         0
      #  Col1 Col2 Col1&Col2_sum New_Value
      #1    6    5            11         1
      #2    2    6             8         1
      #3    3    6             9         0
      #  Col1 Col2 Col1&Col2_sum New_Value
      #1    6    5            11         1
      #2    7    6            13         1
      #3    3    6             9         1
      #  Col1 Col2 Col1&Col2_sum New_Value
      #1    6    5            11         2
      #2    7    6            13         1
      #3    8    6            14         1
      #  Col1 Col2 Col1&Col2_sum New_Value
      #1   11    5            16         2
      #2    7    6            13         2
      #3    8    6            14         1
      

      如果不需要,您可以删除print 语句,我仅包含它以演示中间结果。 df 包含最终输出。


      样本数据

      df <- read.table(text =
          "Col1     Col2
         1        5
         2        6
         3        6", header = T)
      

      【讨论】:

      • 这太好了,谢谢!有没有办法只打印决赛桌?
      • @nak5120 正如我所说,while 循环之后,df 包含最终输出。
      • 正确。只是想知道如何只打印决赛桌而不是之前的决赛桌。
      • @nak512 ???删除循环内的print(df) 语句并在循环后添加print(df)。但是打印只是为了控制台。您可以以df 的身份访问对象
      猜你喜欢
      • 2020-03-07
      • 2011-05-11
      • 1970-01-01
      • 1970-01-01
      • 2021-06-29
      • 2023-03-02
      • 2018-05-21
      • 2020-05-15
      • 2017-04-30
      相关资源
      最近更新 更多