代码之家  ›  专栏  ›  技术社区  ›  nak5120

While循环在R中,For循环在R中

  •  0
  • nak5120  · 技术社区  · 7 年前

    我有如下数据框:

    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
    

    现在在col1中添加5作为第一行,因为6是最小值。

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

    现在加5到2,因为8是最小值。

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

    现在加5到3,因为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
    
    2 回复  |  直到 7 年前
        1
  •  1
  •   Maurits Evers    7 年前

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

    # 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)
    
        2
  •  2
  •   Karan Bhagat    7 年前

    我用R尝试了一下,我以前的答案是Python。 这个程序看起来很基本,因为我不是一个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

    推荐文章