簡體   English   中英

對列表的每個矩陣使用lapply

[英]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$xprob=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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM