Re: [問題] 每行依比例隨機抽樣

作者: celestialgod (天)   2018-05-19 19:36:08
產生太多無用資訊,造成不必要的浪費
最簡單的做法就是直接for就好
nrow <- 10L
numValueChange <- 6L
ncol <- 5e5L
st <- proc.time()
M <- matrix(sample(1:100, nrow*ncol, TRUE), nrow, ncol)
for (i in seq_len(ncol))
M[sample.int(nrow, numValueChange)] <- 0
proc.time() - st
# user system elapsed
# 1.89 0.03 1.96
# check
colSums(M == 0)
st <- proc.time()
M2 <- matrix(sample(1:100, nrow*ncol, TRUE), nrow, ncol)
ind <- replicate(ncol, sample(c(rep(TRUE, numValueChange),
rep(FALSE, nrow - numValueChange))))
M2[ind] <- 0
proc.time() - st
# user system elapsed
# 4.70 0.09 4.80
# check
colSums(M2 == 0)
※ 引述《andrew43 (討厭有好心推文後刪文者)》之銘言:
: # 決定誰要變成0的矩陣
: ind <- replicate(100, sample(c(rep(T, 6), rep(F, 4))))
: # 按ind改M
: M <- matrix(1:1000, 10, 100)
: M[ind] <- 0
: M
: # check
: apply(ind, 2, sum)
: apply(M, 2, function(x) {
: length(which(x == 0))
: })
: M
: ※ 引述《pp61022 (fight)》之銘言:
: : [問題類型]:
: : 程式諮詢(我想用R 做某件事情,但是我不知道要怎麼用R寫出來)
: : [軟體熟悉度]:
: : 使用者(已經有用R 做過不少作品)
: : [問題敘述]:
: : 請簡略描述你所要做的事情,或是這個程式的目的
: : 我有一個矩陣 10*100 (n=10, p=100)
: : 我想要把這100行,每行都依比例隨機選出幾個值,改成指定值
: : 例如:
: : 原始資料範例
: : V1 V2 V3 .... V100
: : 1 10 5 4 .... 42
: : 2 7 15 18 .... 58
: : 3 12 10 77 .... 41
: : 4 9 18 65 .... 74
: : 5 47 57 10 .... 81
: : 6 1 46 18 .... 72
: : 7 37 9 49 .... 30
: : 8 17 8 75 .... 37
: : 9 36 14 10 .... 6
: : 10 71 36 87 .... 48
: : 每行各隨機選取6個值改成我的指定值
: : 轉換後資料範例
: : V1 V2 V3 .... V100
: : 1 10 5 0 .... 0
: : 2 7 0 18 .... 0
: : 3 0 10 0 .... 41
: : 4 9 0 65 .... 0
: : 5 0 0 0 .... 81
: : 6 1 46 0 .... 0
: : 7 0 0 49 .... 30
: : 8 0 8 0 .... 37
: : 9 0 0 10 .... 0
: : 10 0 0 0 .... 0
: : 我一開始是整筆資料直接*0.6 隨機填成指定值,但後來回去看資料,
: : 因為n太少,很容易整行都變成指定值,但我不想要整行都被改成指定值,
: : 才想詢問有沒有版友知道可以怎麼設定每行隨機抽樣的比例,謝謝大家。
作者: pp61022 (fight)   2018-05-19 20:42:00
哦哦 謝謝提供另個方法~

Links booklink

Contact Us: admin [ a t ] ucptt.com