如果满足条件如何重新启动for循环

问题描述 投票:0回答:1

我有一个百分比数据框,正在尝试调整它,以便每列中的所有百分比与该列中的所有其他百分比至少有 2 个百分点的差异,以便它们能够在图表上很好地显示。

df <- data.frame(c("group1", "group2", "group3", "group4"),c(29, 26, 25, 12),c(8, 7, 3, 2))
names(df) <- c("group","var1","var2")

目前我正在使用 for 循环,它可以工作,只是它是单向的:

for(c in 2:ncol(df){
 for(r in 1:nrow(df)){
  if(df[r,c]-order_df[r+1,c]<2){
    group <- df$group[r]
    df[[c]][df$group==group] <- df[[c]][df$group==group]+2
  }
 }
}

在这种情况下,当r=1和c=2时,if条件不成立,因为29-26>2,那么r=2和c=2,if条件成立,26会变成28 。但是,这使它太接近 29,所以我想返回 r=1 并重新检查,以便 29 可以移动到 31。如果有特定条件,有没有办法在 r 中重新启动 for 循环满足了吗?

预期输出:

expected <- data.frame(group=c("group1", "group2", "group3", "group4"),var1=c(31, 28, 25, 12),var2=c(10, 7, 5, 2))
r for-loop if-statement restart
1个回答
0
投票

我不确定这是最好的方法,但假设你不只是希望策划事情......

for (col in 2:3) {
  for (i in rev(seq_len(nrow(df)-1))) {
    df[[col]][i] <- df[[col]][i] + 2*sum(abs(df[[col]][i] - df[[col]][-(1:i)]) < 2)
  }
}

另一种相当流畅地使用 R 的

lapply
的方法是:

df
#    group var1 var2
# 1 group1   29    8
# 2 group2   26    7
# 3 group3   25    3
# 4 group4   12    2
df[,2:3] <- lapply(df[,2:3], function(z) {
  for (i in rev(seq_along(z))[-1]) {
    z[i] <- z[i] + 2*sum(abs(z[i] - z[-(1:i)]) < 2)
  }
  z
})
df
#    group var1 var2
# 1 group1   31   10
# 2 group2   28    7
# 3 group3   25    5
# 4 group4   12    2

数据

df <- data.frame(group=c("group1", "group2", "group3", "group4"),var1=c(29, 26, 25, 12),var2=c(8, 7, 3, 2))
expected <- data.frame(group=c("group1", "group2", "group3", "group4"),var1=c(31, 28, 25, 12),var2=c(10, 7, 5, 2))
© www.soinside.com 2019 - 2024. All rights reserved.