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
访问对象。