我有一个如下数据框:
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
答案 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)