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

While循环在R中,For循环在R中,r,for-loop,while-loop,apply,R,For Loop,While Loop,Apply,我有一个如下所示的数据帧: Col1 Col2 1 5 2 6 3 6 我想写一个while循环,找到最小和,在新列中为该行添加1,直到新列和为5。每行有一个min时,添加1 例如: Col1 Col2 Col1&Col2_sum New_Value 1 5 6 1 2 6

我有一个如下所示的数据帧:

Col1     Col2 
   1        5
   2        6
   3        6
我想写一个while循环,找到最小和,在新列中为该行添加1,直到新列和为5。每行有一个min时,添加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
Col1     Col2    Col1&Col2_sum     New_Value
   6        5               11             1
   7        6               13             1 
   3        6                9             1
现在将5添加到第二个,因为8是最小值

Col1     Col2    Col1&Col2_sum     New_Value
   6        5               11             1
   2        6                8             1 
   3        6                9             0
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
现在在1的基础上增加5,因为11是最小值。(最终产出)


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

# 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

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

# 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

我用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)

process\u dframe我用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)

process\u dframe这太棒了,谢谢!有没有办法只打印最终的表格?@nak5120正如我所说,在
之后,而
循环
df
包含最终的输出。对。只是想知道如何只打印最后一个表,而不是之前的表。@nak512???删除循环内的
print(df)
语句,并在循环后添加
print(df)
。但打印只是为了控制台。您可以通过
df
访问对象。这太棒了,谢谢!有没有办法只打印最终的表格?@nak5120正如我所说,在
之后,而
循环
df
包含最终的输出。对。只是想知道如何只打印最后一个表,而不是之前的表。@nak512???删除循环内的
print(df)
语句,并在循环后添加
print(df)
。但打印只是为了控制台。您可以通过
df
访问对象。