【问题标题】:while loop construction for use with `apply`用于`apply`的while循环构造
【发布时间】:2012-10-31 07:27:51
【问题描述】:

我有一个这样的data.frame df

df <- data.frame (x=1:5,y=1:5)

我想对这个数据框逐行使用apply 函数,我在其中检查依赖于xy 的条件,然后更改xy 元素直到满足我的条件。在此示例中,如果 xy 加起来不等于 8,我会继续为它们挑选新的随机数并重试。

我认为使用while 循环的apply 函数是最好的。所以我尝试了以下方法:

checkchange <- function(x) while(x[1] + x[2] < 8) 
              { 
              x[1] <- sample(5,1)
              x[2] <- sample(5,1)
              return(cbind(x[1],x[2]))
      }

然后我会计划这样做:

newdf <- apply(df,1,checkchange)

这不起作用。我应该使用repeatbreak,还是需要更清楚地指定return 值。非常感谢while循环语法帮助。

【问题讨论】:

    标签: r while-loop


    【解决方案1】:

    正如@Nico 指出的那样,该函数将使用额外的大括号。

    checkchange <- function(x) {      
      while (sum(x) < 8) { 
        # no need to sample from 1:5 if the sum has to be at least 8 
        x <- sample(3:5, 2, TRUE)        
      }
      return(x)
    }
    

    apply 的输出需要转置以匹配数据的原始排列。

    t(apply(df, 1, checkchange))
    

    顺便说一句,函数不需要循环:

    checkchange <- function(x) {
     if (sum(x) < 8) {
        x[1] <- sample(3:5, 1)
        x[2] <- ifelse(x[1] == 3, 5, sample(seq(8 - x[1], 5), 1))
      }
      return(x)
    }
    

    【讨论】:

    • +1 感谢 sven 的大力帮助,并抢占了我的 t。用ifelse 来考虑快捷方式也很有用!
    【解决方案2】:

    您的匿名函数缺少花括号

    这对我有用:

    checkchange <- function(x) 
                  { 
                  while((x[1] + x[2]) < 8)
                    {
                    x[1] <- sample(5,1)
                    x[2] <- sample(5,1)
                    }
                  return(cbind(x[1],x[2]))
                  }
    

    【讨论】:

      猜你喜欢
      • 2015-11-25
      • 2011-10-14
      • 2013-12-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-04-24
      • 2016-06-12
      相关资源
      最近更新 更多