2015-12-07 96 views
3
存儲在列表的一項研究

我有結果。添加多個列表

我總共有1000只列出所有這些都是一樣的尺寸。

每個列表包含39個元件,其具有不同的尺寸的矩陣。

我想總結這些列表,然後通過1000

劃分他們,我不能想出一個辦法做到這一點。

例子:

a<-matrix(0,nrow=5,ncol=6) 
b<-matrix(0,nrow=2,ncol=10) 

list1 <- list(a,b) 

a<-matrix(0,nrow=5,ncol=6) 
b<-matrix(0,nrow=2,ncol=10) 

list2 <- list(a,b) 

a<-matrix(0,nrow=5,ncol=6) 
b<-matrix(0,nrow=2,ncol=10) 

list3 <- list(a,b) 

我要添加列表1 +列表2 +項目list3 ... list1000

,然後通過1000

+0

每個矩陣的位置在每個列表相同的,所以我想每個矩陣添加到同一矩陣 – user3742038

+0

與你的真實結果也不同的變量,比如'list1','list2'名單,.. 。?或者他們存儲在其他列表中? – Julius

+0

它們存儲在單獨的Rdata文件中。 – user3742038

回答

3

您可以使用MapReduce組合並使用mget將所有列表收集到一個列表中。

a<-matrix(1,nrow=5,ncol=6) 
b<-matrix(10,nrow=2,ncol=10) 

list1 <- list(a,b) 
list2 <- list(a,b) 
list3 <- list(a,b) 

l <- mget(ls(pattern = '^list\\d+$')) 
(fl <- Reduce(function(x, y) Map(`+`, x, y), l)) 

# [[1]] 
#  [,1] [,2] [,3] [,4] [,5] [,6] 
# [1,] 3 3 3 3 3 3 
# [2,] 3 3 3 3 3 3 
# [3,] 3 3 3 3 3 3 
# [4,] 3 3 3 3 3 3 
# [5,] 3 3 3 3 3 3 
# 
# [[2]] 
#  [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10] 
# [1,] 30 30 30 30 30 30 30 30 30 30 
# [2,] 30 30 30 30 30 30 30 30 30 30 

Map(`/`, fl, 1000) 

# [[1]] 
#  [,1] [,2] [,3] [,4] [,5] [,6] 
# [1,] 0.003 0.003 0.003 0.003 0.003 0.003 
# [2,] 0.003 0.003 0.003 0.003 0.003 0.003 
# [3,] 0.003 0.003 0.003 0.003 0.003 0.003 
# [4,] 0.003 0.003 0.003 0.003 0.003 0.003 
# [5,] 0.003 0.003 0.003 0.003 0.003 0.003 
# 
# [[2]] 
#  [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10] 
# [1,] 0.03 0.03 0.03 0.03 0.03 0.03 0.03 0.03 0.03 0.03 
# [2,] 0.03 0.03 0.03 0.03 0.03 0.03 0.03 0.03 0.03 0.03 
+0

這需要在所有的1000名名單 – user3742038

+0

手動鍵入@ user3742038告訴我在哪裏我手動輸入他們 – rawr

+1

我在討伐擺脫[R [stringly類型代碼(http://c2.com/cgi/wiki?StringlyTyped)所以我想提一提的是,R有一個特定的語法來表示(否則無效)標識符,通過\''+'\'(即反引號),並使用字符串這裏,而有效的,是一個奇怪的黑客工具,*如果R有適當的類型系統,就不應該工作。這就是說,很好的答案。 –

0

分在最後的列表中的每個元素我最近實施一些遞歸的實用功能。但是他們不檢查前提條件(等長,元素的總結)。

編輯:我有固定在評論中提到的問題。 for循環被高階函數取代,函數具有更好的錯誤行爲。該功能還處理更復雜的列表結構,例如列表包含其他包含數字元素的列表。它比OP所要求的更復雜(也更復雜),但我認爲值得保留以防有人需要遞歸解決方案。

sum_numeric_lists <- function(...){ 
    lists <- list(...) 

    if (length(unique(sapply(lists, length))) > 1) { 
    stop("lists are not of equal length") 
    } 

    Map(function(...) { 
    elems <- list(...) 
    if (length(unique(sapply(elems, class))) > 1) { 
     stop("corresponding elements have different types") 
    } 
    if (is.list(elems[[1]])) { 
     sum_numeric_lists(...) 
    } else if(is.numeric(elems[[1]])){ 
     Reduce(`+`, elems) 
    } else { 
     warning("lists contain types other than numeric, which are preserved as NULL elements") 
     NULL 
    } 
    }, ...) 

} 


devide_numeric_list_by <- function(l, divisor){ 

    lapply(X = l, FUN = function(elem) { 
    if (is.list(elem)) { 
     devide_numeric_list_by(elem, divisor) 
    } else if(is.numeric(elem)){ 
     elem/divisor 
    } else { 
     warning("lists contain types other than numeric, which are preserved as NULL elements") 
     NULL 
    } 
    }) 

} 

avg_numeric_lists <- function(...){ 
    sum_l <- sum_numeric_lists(...) 
    devide_numeric_list_by(sum_l, length(list(...))) 
} 

一些測試:

avg_numeric_lists() 
avg_numeric_lists(NULL) 
avg_numeric_lists(list()) 
avg_numeric_lists(list(NULL)) 
avg_numeric_lists(list(1)) 
avg_numeric_lists(list(list(1))) 

list1 <- list(m_first_lvl = matrix(sample(1:10, 20, replace = T), nrow=4, ncol=5),list(m_sec_lvl = matrix(sample(1:10, 6, replace = T), nrow=3, ncol=2)),"not_a_list_or_numeric",a_number = 1) 
list2 <- list(m_first_lvl = matrix(sample(1:10, 20, replace = T), nrow=4, ncol=5),list(m_sec_lvl = matrix(sample(1:10, 6, replace = T), nrow=3, ncol=2)),"not_a_list_or_numeric",a_number = 2) 
list3 <- list(m_first_lvl = matrix(sample(1:10, 20, replace = T), nrow=4, ncol=5),list(m_sec_lvl = matrix(sample(1:10, 6, replace = T), nrow=3, ncol=2)),"not_a_list_or_numeric",a_number = 3) 
avg_numeric_lists(list1, list2, list3) 

喚起它的所有列表中的全球環境(由RAWR的建議):

do.call(what = avg_numeric_lists, args = mget(ls(pattern = '^list\\d+$'))) 
+0

這需要在所有1000個列表中手動輸入 – user3742038

+0

您是否已經downvote?在你指定之前,我寫了這個答案,列表來自1000個.RData文件...但是,我想你會對另一個答案感到滿意。 – fab

+2

我沒有低估這個,但它不是很好的代碼。這很難閱讀,並且循環可能應該被適當的高階列表函數替代。此外,它可以從正確的錯誤處理中受益,而不是將字符串寫入結果中(在極少數情況下,這是合適的)。 –