[英]Using lapply to each matrix of list
我正在嘗試對列表的每個矩陣使用lapply
。
我想使用lapply
來應用sample
函數。
讓我們舉個例子。 我生成了概率,該概率將用於sample
函數。 (對不起,未優化。)
set.seed(1001)
given<-replicate(3,list(matrix(unlist(replicate(5,sample(c(0.2,0.3,0.4,0.1),4,replace=FALSE),simplify=FALSE)),ncol=4)))
given
[[1]]
[,1] [,2] [,3] [,4]
[1,] 0.1 0.4 0.2 0.4
[2,] 0.3 0.2 0.1 0.2
[3,] 0.2 0.1 0.1 0.3
[4,] 0.4 0.3 0.3 0.1
[5,] 0.3 0.4 0.2 0.4
[[2]]
[,1] [,2] [,3] [,4]
[1,] 0.4 0.4 0.3 0.4
[2,] 0.3 0.1 0.4 0.2
[3,] 0.1 0.2 0.1 0.4
[4,] 0.2 0.1 0.3 0.3
[5,] 0.3 0.2 0.2 0.1
[[3]]
[,1] [,2] [,3] [,4]
[1,] 0.3 0.2 0.2 0.1
[2,] 0.2 0.3 0.3 0.3
[3,] 0.1 0.4 0.2 0.2
[4,] 0.4 0.4 0.3 0.4
[5,] 0.1 0.1 0.4 0.1
因此,此列表包含三個組成部分,每個組成部分都是5 * 4矩陣。 矩陣的每一行(因此,它有15行)被賦予概率。 我想以給定的概率生成10個樣本。 為簡單起見,我將以給定的概率將“ 1”重新采樣為“ 4”。
借助本文檔( 如何生成具有預測概率的隨機數據集? ),我學會了將sample
函數應用於一個矩陣的一個分量。 如果given
一個矩陣,我將執行此功能。
lapply(1:nrow(given), function(x) sample(1:4, 10, replace = TRUE, prob = given[x, ]))
但是,正如您所看到的, given
了一個包含3個矩陣的列表。 我嘗試了幾次嘗試,例如prob=given$x
, prob=given[[x,]]
等...,但是都失敗了。 有辦法申請嗎?
*其他問題
致羅納克·沙(Ronak Shah)
事實證明完全正確。 謝謝!
但是,很抱歉沒有詢問所有問題。 實際上,概率集中缺少一些數據。
我將在given
定的缺失值中排成一行。
given[[2]][1,]<-NA
given
[[1]]
[,1] [,2] [,3] [,4]
[1,] 0.1 0.4 0.2 0.4
[2,] 0.3 0.2 0.1 0.2
[3,] 0.2 0.1 0.1 0.3
[4,] 0.4 0.3 0.3 0.1
[5,] 0.3 0.4 0.2 0.4
[[2]]
[,1] [,2] [,3] [,4]
[1,] NA NA NA NA
[2,] 0.3 0.1 0.4 0.2
[3,] 0.1 0.2 0.1 0.4
[4,] 0.2 0.1 0.3 0.3
[5,] 0.3 0.2 0.2 0.1
[[3]]
[,1] [,2] [,3] [,4]
[1,] 0.3 0.2 0.2 0.1
[2,] 0.2 0.3 0.3 0.3
[3,] 0.1 0.4 0.2 0.2
[4,] 0.4 0.4 0.3 0.4
[5,] 0.1 0.1 0.4 0.1
閱讀您的答案后,我會在您的答案中處理一些代碼。 但是結果卻大不相同。
lapply(given, function(x) t(sapply(seq_len(nrow(x)), function(y)
ifelse(is.na(x[y,]),NA,sample(1:4, 10, replace = TRUE, prob = x[y, ])))))
[[1]]
[,1] [,2] [,3] [,4]
[1,] 4 4 4 2
[2,] 2 3 2 2
[3,] 4 4 1 1
[4,] 1 3 1 1
[5,] 3 3 1 1
[[2]]
[,1] [,2] [,3] [,4]
[1,] NA NA NA NA
[2,] 3 4 3 2
[3,] 4 2 2 2
[4,] 4 2 1 1
[5,] 1 2 4 1
[[3]]
[,1] [,2] [,3] [,4]
[1,] 1 1 2 2
[2,] 3 4 3 4
[3,] 2 3 2 4
[4,] 2 4 4 2
[5,] 2 3 3 3
如您所見,NA結果正確,但是它僅生成4個樣本,而不生成10個樣本。 您能告訴我如何解決這個問題嗎?
在不過度復雜化且無需您繼續嘗試的情況下,我們可以在sapply
內部使用lapply
。 lapply
將遍歷每個列表,而sapply
將遍歷列表中的每一行。
lapply(given, function(x) t(sapply(seq_len(nrow(x)), function(y)
sample(1:4, 10, replace = TRUE, prob = x[y, ]))))
#[[1]]
# [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10]
#[1,] 2 3 4 4 3 4 4 4 2 1
#[2,] 1 1 1 2 4 1 2 2 2 3
#[3,] 1 4 4 1 4 1 1 2 2 4
#[4,] 1 1 3 2 3 2 3 1 1 3
#[5,] 4 2 3 1 2 2 1 4 1 4
#[[2]]
# [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10]
#[1,] 1 3 2 3 2 1 1 1 2 1
#[2,] 3 1 1 1 3 3 2 3 1 4
#[3,] 4 3 4 2 4 4 4 4 4 4
#[4,] 3 3 4 4 3 4 4 2 3 4
#[5,] 1 1 2 2 4 1 1 2 1 4
#[[3]]
# [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10]
#[1,] 3 1 1 2 1 3 3 1 2 1
#[2,] 4 4 3 1 3 3 3 3 2 4
#[3,] 1 1 2 2 2 3 4 4 2 4
#[4,] 2 1 4 4 1 3 3 4 4 1
#[5,] 3 3 3 3 3 3 1 2 3 3
為了處理NA
值,我們可以做
lapply(given, function(x) t(sapply(seq_len(nrow(x)), function(y)
if (anyNA(x[y,])) rep(NA, 10) else
sample(1:4, 10, replace = TRUE, prob = x[y, ]))))
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.