4

私は R の経験がありますが、常に新しいコードを書くのに苦労しています。現在のプロジェクトに取り組んでいるときに、ここでいくつかの非常に役立つ投稿を見つけましたが、次のステップが見つからないようです。これが私がこれまでに行ったことです:

  • ランキングの 20x20 .csv をインポートしました。各列には 1 から 20 までの各整数の 1 つのインスタンスが含まれているため、すべての colSum は 210 です。rowSum はさまざまです。

  • こちらの投稿を使用して、元のマトリックスから 4 行をランダムにサンプリングし、それらを新しい 4x20 マトリックスに入れました。

今、列を置き換えずに、各行から 5 列をサンプリングする必要があります。 つまり、各列を 1 回だけ使用し、各行に 5 つの値を持つ必要があります。(これにより、適切な場所に 20 個の値と 60 個のゼロがある行列が得られるかどうか、または 5 つの値の 4 つのベクトルが得られるかどうかについては好みがありません。行列が必要だと思いますか?)

コンテキストが役立つ場合は、教室でトピックのランキングに基づいてグループを作成しようとしています。行はトピック、列は投票者 (学生) です。最終的には、これらのランダムな割り当てをforループで作成し、プログラムを何度も実行して、元の行列を見つめるのではなく、自動的に選択を最適化することを望みます(何らかの測定による;明らかに最適化にはさまざまな方法があります)。私は過去にやったことがあります。

これは私の4x20マトリックスです:

    J  E  I  S  A  N  H  T  M  B  D  K  O  G  P  L  Q  R  F  C
2   5  4  1  1  5 13  3  4 13 11 14 14 20  9 15  9 11 17  9 15
13 20 19 17 19 19  7  4 19  7  1  5  1 17 15 10  6  7 14  6  3
14 18  2 12 14 11 19 18 15 19  4  8 19  2  2 13  7  9  1 12 10
18  4  7 18  5 12 18  2 20  6  7 16 15  5 18  1 13  2 18 14 16

これは私が欲しいもの(の1つのバージョン)です:

    J  E  I  S  A  N  H  T  M  B  D  K  O  G  P  L  Q  R  F  C
2   0  4  1  1  0  0  3  4  0  0  0  0  0  0  0  0  0  0  0  0
13  0  0  0  0  0  7  0  0  0  1  5  1  0  0  0  0  0  0  0  3
14  0  0  0  0 11  0  0  0  0  0  0  0  0  2  0  7  0  1 12  0
18  4  0  0  0  0  0  0  0  6  0  0  0  5  0  1  0  2  0  0  0
4

4 に答える 4

1

data.frameあなたが「x」と呼ばれると仮定すると、これlistは単一行data.frameの結果となる単純なアプローチです。

データは次のとおりです。

x <- structure(list(J = c(5L, 20L, 18L, 4L), E = c(4L, 19L, 2L, 7L
  ), I = c(1L, 17L, 12L, 18L), S = c(1L, 19L, 14L, 5L), A = c(5L, 
  19L, 11L, 12L), N = c(13L, 7L, 19L, 18L), H = c(3L, 4L, 18L, 
  2L), T = c(4L, 19L, 15L, 20L), M = c(13L, 7L, 19L, 6L), B = c(11L, 
  1L, 4L, 7L), D = c(14L, 5L, 8L, 16L), K = c(14L, 1L, 19L, 15L
  ), O = c(20L, 17L, 2L, 5L), G = c(9L, 15L, 2L, 18L), P = c(15L, 
  10L, 13L, 1L), L = c(9L, 6L, 7L, 13L), Q = c(11L, 7L, 9L, 2L), 
      R = c(17L, 14L, 1L, 18L), F = c(9L, 6L, 12L, 14L), C = c(15L, 
      3L, 10L, 16L)), .Names = c("J", "E", "I", "S", "A", "N", 
  "H", "T", "M", "B", "D", "K", "O", "G", "P", "L", "Q", "R", "F", 
  "C"), class = "data.frame", row.names = c("2", "13", "14", "18"
  ))

そしてサンプリング:

set.seed(1)
temp <- matrix(sample(20), nrow = 4)
do.call(rbind, lapply(1:4, function(y) {
  x[y, -temp[y, ]] <- 0
  x[y, ]
}))
#     J E  I S  A  N H  T M B D  K O  G  P  L Q R F  C
# 2   0 0  0 1  0 13 0  0 0 0 0 14 0  0  0  0 0 0 9 15
# 13 20 0  0 0  0  0 0 19 0 1 0  0 0 15  0  0 7 0 0  0
# 14  0 0 12 0 11  0 0  0 0 0 8  0 0  0 13  0 0 1 0  0
# 18  0 7  0 0  0  0 2  0 6 0 0  0 5  0  0 13 0 0 0  0
于 2013-02-01T17:39:50.497 に答える
1

パッケージを使用するとMatrix、インデックスからこれを非常に簡単に構築できます。

i <- sample(nrow(X), ncol(X), replace=TRUE)
j <- seq(ncol(X))
sparseMatrix(i,j,x=X[cbind(i,j)])

収量:

> sparseMatrix(i,j,x=X[cbind(i,j)])
4 x 20 sparse Matrix of class "dgCMatrix"

[1,] . .  .  .  . 13 .  . 13 . 14  . . 9  .  . .  . . 15
[2,] . .  .  .  .  . .  .  . .  .  . . .  .  . .  . 6  .
[3,] . .  . 14 11  . . 15  . 4  . 19 2 . 13  . .  . .  .
[4,] 4 7 18  .  .  . 2  .  . .  .  . . .  . 13 2 18 .  .
于 2015-07-31T18:58:00.470 に答える
1

これはうまくいくはずです

data <- matrix(sample(letters,20*4,rep=T),4) # Create a fake data

sample <- sample(1:20) # Scramble the order of the columns

out <- matrix(0,4,5) # 5 letters for 4 lines

for (i in 1:4) {
 out[i,] <- data[i,sample[1:5 + (i-1)*5]] # Sample 5 values of each line
}
于 2013-02-01T17:07:02.017 に答える