在R中使用While循环

时间:2018-08-06 20:30:07

标签: r for-loop while-loop apply

我有一个如下数据框:

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添加到第一行,因为6是最小值。

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

现在将5最小添加到第二个数字。

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

现在将3加5,因为最小为9。

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

现在将5加到1,因为最小为11。 (最终输出)

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

2 个答案:

答案 0 :(得分:2)

我使用R进行了尝试。我以前的答案是在Python中。 该程序看起来很基础,因为我不是R程序员,但还是尝试了一下。至少它将对R(希望如此)陌生的人有所帮助。 注意:代码可能与R编程方式无关。

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

输出      {{1}}

答案 1 :(得分: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

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


样本数据

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