1

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

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

apply我想对这个数据框逐行使用函数,在其中检查一个依赖于xand的条件,y然后更改xandy元素,直到它们满足我的条件。在这个例子中,如果x加起来y不等于 8,我会不断为它们挑选新的随机数,然后再试一次。

我认为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)

这行不通。我应该使用repeatand abreak还是需要return更清楚地指定一个值。while非常感谢循环语法帮助。

4

2 回答 2

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]))
              }
于 2012-11-11T18:41:04.383 回答
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)
}
于 2012-11-11T18:58:22.150 回答