簡體   English   中英

如何在不丟失結構的情況下將 NESTED 列表強制為雙精度(R)

[英]How to coerce NESTED list into double without losing the structure (R)

似乎有很多關於如何將列表轉換為雙精度的問題,但似乎沒有任何東西可以保持列表的結構有效。

我有一個這樣的嵌套列表(R 輸出):

我的列表

[[1]] 
[1]  1  3  4  8 11 13 17

[[2]] 
 [1]  1  2  3  4  5  6  7  8  9 10 11 12 13 14 15 16 17 18 19 20

[[3]]  
[1]  2 14

然后我將此列表傳遞給 JAGS 以迭代其元素。 在 JAGS 循環中,我想迭代第一個、第二個和第三個元素,然后檢索存儲在其中的數字,以便在另一個循環中再次迭代。 這意味着我想訪問第一個元素的“1 3 4 8 11 13 17”等等。


我用來迭代的 JAGS 腳本中的代碼是這樣的:

    for (j in 1:subjects) {  # Subject-loop
          for (i in my_list[j]) {  # Trial loop
   .... 

     }
    }

這樣做的背景是並非所有受試者都有有效的試驗。 所以我需要通過 JAGS 對每個主題的有效試驗。

我打算用上面的嵌套列表來做到這一點。 然而,事實證明 JAGS 無法處理列表 - 所以現在我嘗試將其轉換為 JAGS 可以迭代的東西,而不會丟失哪些試驗屬於哪個主題的信息。

我需要保持結構正常運行,因此僅將列表轉換為單個向量的所有內容都無濟於事,因為我無法再對其進行迭代。

有什么建議么? 我試圖通過列表,但 JAGS 無法處理,需要一個“雙重”。 我也嘗試將其轉換為矩陣,但未能保持結構。

謝謝!


更新:我試過這個,這有點像矩陣似乎與 JAGS 一起工作

list_as_matrix <- do.call(rbind, my_list)

但是嵌套列表的長度不同,因此矩陣中的空列只是一遍又一遍地填充相同的值。


JAGS 錯誤代碼是:

4 nodes produced errors; first error: 'list' object cannot be coerced to type "double"  

感謝 DaveArmstrong 的輸入,更新了答案:

# a list of 6 subjects and their valid trials
subjects_and_their_valid_trials <- list(
  c(1,3,4,8, 11,13,17), 
  c(1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20), 
  c(2, 14),
  c(1,3,4,8, 11,13,17), 
  c(1,2,3,4,5,6,8,9,10,11,12,13,14,15,17,18,19,20), 
  c(6, 12))

l <- subjects_and_their_valid_trials # make it easier to read

maxlen <- max(sapply(l, length))
mat <- t(sapply(l, function(x)c(x, rep(NA, maxlen-length(x)))))
minvals <- 1
maxvals <- apply(mat, 1, function(x)max(which(!is.na(x))))


# ---- How the JAGS Loop is structured
nSubj_Condition1 <- 6

# Loop for condition 
for (j in 1:nSubj_Condition1) {  #Subject-loop
  
  print( "///---------------------------------- ///")
  print(paste("Subject number", j))
  
  #-------------------------
  # This loop restricts the following loop to valid cases in the matrix
  for (k in 1:maxvals[j]) { 
    
    print(paste("Iterating through trial matrix... step", k))
    
    # This loop loops through the matrix of valid trials for each subjects 
    for (i in mat[j,k]) {
      
      print(paste("A valid trial number is:", i))
    }
  }
}

像這樣的東西怎么樣:

l <- list(
c(1,3,4,8, 11,13,17), 
c(1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20), 
c(2, 14))

將您的列表變成一個用NA值填充的矩陣。

maxlen <- max(sapply(l, length))
mat <- t(sapply(l, function(x)c(x, rep(NA, maxlen-length(x)))))

# > mat
# [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10] [,11] [,12] [,13] [,14] [,15] [,16]
# [1,]    1    3    4    8   11   13   17   NA   NA    NA    NA    NA    NA    NA    NA    NA
# [2,]    1    2    3    4    5    6    7    8    9    10    11    12    13    14    15    16
# [3,]    2   14   NA   NA   NA   NA   NA   NA   NA    NA    NA    NA    NA    NA    NA    NA
# [,17] [,18] [,19] [,20]
# [1,]    NA    NA    NA    NA
# [2,]    17    18    19    20
# [3,]    NA    NA    NA    NA

然后,對於每個主題,識別具有有效數據的第一列和最后一列。

minvals <- 1
maxvals <- apply(mat, 1, function(x)max(which(!is.na(x))))

然后,在您的 JAGS 模型中,您可以從mat中提取適當的值來識別試驗編號。

for (j in 1:subjects) {  # Subject-loop
  for (i in minvals[j]:maxvals[j]) {  # Trial loop
     mat[j,i] ## gives you the trial number for each subject 
    
  }
}

您可以映射列表,該列表在將任意函數應用於每個列表成員后返回初始列表(如果需要,也可以遞歸)。 在基礎 R 中,您可以使用lapply()Map()來執行此操作。 包 { purrr } 用各種方便的功能擴展了這個概念。

例子:

## base R
lapply(your_list, function(list_element) {some_JAGS_call(list_element)})

## purrr (plus pipe and formula notation)
your_list %>% map(~ some_JAGS_call(.x))

這個關於 R 和 JAGS 的在線資源可能會有所幫助。

編輯 1例如,如果您需要將my_list從向量列表映射到適合 JAGS 的矩陣列表,您可以lapply (list-apply) 函數as.matrix()

my_list_of_matrices <- lapply(my_list, function(el) as.matrix(el))

(根據您的 JAGS 調用的要求,向as.matrix()提供更多參數。)

編輯 2陷阱:當您在循環中使用單括號索引列表時: for (i in my_list[j]) { # Trial loop您仍將獲取列表元素作為列表。 使用雙括號: for (i in my_list[[j]])來選擇沒有粘性列表部分的列表元素(例如矩陣,如果有的話)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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