1

R でデータを均等に分割しようとしています。たとえば、R Studio に組み込まれている 50 行のデータセット car を使用しています。データを 2 つのセクションに分割する場合は、次の行に沿って何かを行います。 cars$split <- rep(1:2, each=25)ここでは、という列を作成しsplit、最初の 25 個の値を 1 に割り当て、次の 25 個の値を 2 に割り当てます。ただし、データを 8 つのセクション (ユーザーの裁量に基づく) に分割したかったのですが、50/8 は 6.25 であるため、均等に分割することはできません。この場合、最後の 2 行 (50 / 8 = 6.25、および 6 * 8 = 48 であるため、2 行が残るため) を、この場合は上記の関数を使用して数値 8​​ に割り当てるだけです。しかし、私はこれを行うことができませんrep関数は適切に分割する必要があるため、そのようにいくつかのロジックを書き出そうとしましたが、次のような問題が発生します。

Error in `$<-.data.frame`(`*tmp*`, "split", value = c(1L, 1L, 1L, 1L,  : replacement has 48 rows, data has 50 

これを修正する方法についてのアイデアはありますか? 私の試みを以下に示します。

numDataPerSection <- floor(nrow(cars) / userInputNum)
if(nrow(cars) %% userInputNum != 0){
  #If not divisible, assign last few data points to the last number
  cars$split <- rep(1:ncls, each=numDataPerSection, len = nrow(cars) - (nrow(cars) %% userInputNum))
  for(i in nrow(cars) %% userInputNum){
    cars$split[nrow(cars) - i] <- userInputNum 
  }
}
#Everything divides correctly
else{
  cars$split <- rep(1:ncls, each=numDataPerSection)
}
4

3 に答える 3

0

length.outの引数を使用して列rep()を作成できますsplit: rep(1:8, length.out = 50, each = round(50/8))。このround()関数を使用すると、グループ サイズの均一な分布を達成するのにかなりうまく機能します。

> table(rep(1:8, length.out = 50, each = round(50/8)))

1 2 3 4 5 6 7 8 
8 6 6 6 6 6 6 6 
于 2015-04-15T12:49:25.473 に答える