2017-12-31 39 views
0

n行とm列のランダム行列を作成したいとします。行列の各行の要素を数値の集合からランダムに選びたいとします。私は各行に少なくとも1つの異なる番号を付けたい。私は行のすべての要素が同じであることを望んでいません。私はかつて私の質問hereを尋ねましたが、なぜ私が提供された機能が同じ要素を持つ行を与えているのかわかりません。どのようにこの機能を調整できますか?私は、n行m列のランダム行列を作りたいすべての要素が同じでない行がなく、Rの行列にランダムに数の集合を割り当てる方法

x <- c(1, 1.5, 2, 3,4) 
set.seed(123456) 
matall=f2(x, 1200, 4) 
View(matall) 

     [,1] [,2] [,3] [,4] 
    [1,] 3.0 3.0 1.5 1.5 
    [2,] 1.5 1.0 2.0 1.0 
    [3,] 4.0 1.0 3.0 2.0 
    [4,] 4.0 4.0 4.0 4.0 
+0

例では行番号4を見てください。すべての要素は4です。私はこれが起こることを望んでいません。私は少なくとも1つの要素が一列に異なるようにしたい。 – Fate

答えて

1

関数定義にタイプミスがあります。 while句は

while (any(apply(result, 1, function(x) length(unique(x)) == 1))) { 

代わりに

while (any(apply(result, 1, function(x) length(unique(result)) == 1))) { 

を読んでください、それが同じ値を持つ行が発見されるたびに新たに全マトリックスを作成しようとして、しかし、関数はすぐに終了しません。

改良版のみ同じ値

f3 <- function(x, n, m) { 
    if (length(unique(x)) == 1) { 
    stop('x has only one unique element.', call. = FALSE) 
    } 
    result <- replicate(m, sample(x, n, replace = TRUE)) 
    uni_rows <- apply(result, 1, function(x) length(unique(x)) == 1) 
    while (any(uni_rows)) { 
    result[which(uni_rows), ] <- replicate(m, sample(x, sum(uni_rows), replace = TRUE)) 
    uni_rows <- apply(result, 1, function(x) length(unique(x)) == 1) 
    } 
    return(result) 
} 

次に、

x <- c(1, 1.5, 2, 3, 4) 
set.seed(123456) 
matall <- f3(x, 1200, 4) 
any(apply(matall, 1, function(x) length(unique(x)) == 1)) 
[1] FALSE 

戻り

head(matall, 11) 
0と行を置き換えます
 [,1] [,2] [,3] [,4] 
[1,] 3.0 3 1.5 1.5 
[2,] 1.5 1 2.0 1.0 
[3,] 4.0 1 3.0 2.0 
[4,] 2.0 4 3.0 1.0 
[5,] 4.0 1 1.5 3.0 
[6,] 4.0 3 2.0 3.0 
[7,] 2.0 3 4.0 4.0 
[8,] 4.0 1 2.0 4.0 
[9,] 1.5 1 4.0 1.0 
[10,] 4.0 4 3.0 3.0 
[11,] 1.5 3 4.0 1.5 
+0

ありがとうありがとうございますこのサイトの方針のおかげであなたの答えが嫌いです – Fate

+0

@Fateあなたは少なくとも15アップアップの評判が必要ですが、選択した解答のチェックマーク記号をクリックすることで、あなたの問題を解決するのに役立ちます。 – Uwe

1

:ここ

f2 <- function(x, n, m) { 
if (length(unique(x)) == 1) { 
    stop('x has only one unique element.', call. = FALSE) 
} 
result <- t(replicate(n, sample(x, m, replace = TRUE))) 
while (any(apply(result, 1, function(x) length(unique(result)) == 1))) { 
    result <- t(replicate(n, sample(x, m, replace = TRUE))) 
} 
return(result)} 

は一例です。

cols <- 3; rows <- 3 
m <- matrix(ncol = cols, nrow = rows) 

Iは行列の各列の要素がランダム数のセットから を選択したいです。

set.seed(2) 
set <- seq(ncol(m)-1L) 
m[] <- sample(set, length(m), replace = T) 
m 
#  [,1] [,2] [,3] 
# [1,] 1 1 1 
# [2,] 2 2 2 
# [3,] 2 2 1 

私は、各行に少なくとも1つの別の番号を持っていると思います。

rowRanges <- matrixStats::rowRanges(m) 
(isSingle <- rowRanges[,2]-rowRanges[,1]==0) 
# [1] TRUE TRUE FALSE 

m[isSingle,1] <- vapply(rowRanges[isSingle, 1], function(x) set[set!=x][1], 0L) 
m 
#  [,1] [,2] [,3] 
# [1,] 2 1 1 
# [2,] 1 2 2 
# [3,] 2 2 1 

か、あなたが選択する値を設定し、コラムたという点で割り当てをランダム化する場合:

vsample <- Vectorize(function(x) sample(set[set!=x], size = 1L), "x") 
idx <- cbind(row=which(isSingle), col=sample(ncol(m), sum(isSingle), replace = TRUE)) 
mvals <- vsample(rowRanges[isSingle, 1]) 
m[idx] <- mvals 
+0

私はset = c(1,2,3,4)にセットを変更し、このエラーを後で受け取りました: "vapply(rowRanges [isSingle、1]、function(x)set [set!= x]、0L): 値は長さ1、 でなければならないが、FUN(X [[1])の結果は長さ3 " – Fate

+0

@Fate My bad、set [set!= x] [1] '' vapply'が1つの値しか取らないようにしてください(この場合、行の中にないもの)。 – lukeA

+0

ありがとうございます。 – Fate

関連する問題