1

私はこのようなdata.frameを持っていますdf

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

このデータフレームに対して行ごとに関数を使用したいと思います。ここで、とapplyの両方に依存する条件をチェックし、条件が満たされるまで要素と要素を変更します。この例では、合計が8になる場合と、合計しない場合は、それらの新しい乱数を選択し続けて、再試行します。xyxyxy

ループを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に指定する必要がありますか。ループ文法は大歓迎です。returnwhile

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 に答える