while循环结构与`apply`一起使用

时间:2012-11-11 18:32:30

标签: r while-loop

我有一个像这样的data.frame df

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

我希望逐行使用apply函数到这个数据框,在那里我检查一个依赖于xy的条件,然后更改{{ 1}}和x元素直到满足我的条件。在此示例中,如果yx最多不加8,我会继续为它们选择新的随机数,然后重试。

我认为使用y循环的apply函数最好。所以我尝试了以下内容:

while

然后我会计划这样做:

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) repeat还是我需要更清楚地指定break值。 return循环语法非常感谢。

2 个答案:

答案 0 :(得分:3)

您缺少匿名函数的大括号

这对我有用:

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]))
              }

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