2012-11-11 125 views
1

我有这样一个data.frame df使用:while循环结构与`apply`

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

我想用一个apply功能逐行这个数据帧,在这里我检查条件取决于xy,然后更改xy元素,直到它们符合我的条件。在这个例子中,如果xy不加起来为8,我不断为他们选择新的随机数字,然后重试。

我想函数使用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) 

这是行不通的。我应该使用repeatbreak还是需要更清楚地指定return值。我们非常感谢while循环语法。

回答

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

由于@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) 
} 
+0

+1感谢斯文很大的帮助,并抢占了我的't'。用'ifelse'也可以想到快捷键! – user1320502