我有一个像这样的data.frame df
:
df <- data.frame (x=1:5,y=1:5)
我希望逐行使用apply
函数到这个数据框,在那里我检查一个依赖于x
和y
的条件,然后更改{{ 1}}和x
元素直到满足我的条件。在此示例中,如果y
和x
最多不加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
循环语法非常感谢。
答案 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)
}