2016-01-19 11 views
7

मैं एक वेक्टर में संग्रहीत नामों के अनुसार सूची में कुल योग (योग) एकत्र करना चाहता हूं। यहाँ कुछ उदाहरण डेटा:नामों के वेक्टर के आधार पर सूची में मैट्रिस को कैसे एकत्रित करें?

lst <- list("111"=matrix(c(1, 0, 6, NA, 1, 0), 
           nrow = 1, byrow = T), 
      "112"=matrix(c(6, 2, 2, 0, 3, NA), 
           nrow = 1, byrow = T), 
      "113"=matrix(c(2, 3, 0, 0, 1, 1), 
         nrow = 1, byrow = T)) 
agg.nam <- c(111,113) 

मेरे उम्मीद परिणाम है:

> res 
$ 
    [,1] [,2] [,3] [,4] [,5] [,6] 
[1,] 3 3 6 0 2 1 

तो, पहले और तीसरे मैट्रिक्स (na.rm = सही) के साथ अभिव्यक्त किया जाता है।

lapply(lst, function(x) x[, which(names(x) %in% agg.nam)]) 

लेकिन मैं पहले से ही इस बात में विफल रहा है, योग के बिना:

मैं agg.nam सबसेट को पहले की कोशिश की।

उत्तर

4

आप के साथ एक मैट्रिक्स में प्रासंगिक सूची तत्वों को आकर्षित कर सकते हैं:

do.call(rbind, lst[as.character(agg.nam)]) 
#  [,1] [,2] [,3] [,4] [,5] [,6] 
# [1,] 1 0 6 NA 1 0 
# [2,] 2 3 0 0 1 1 

सब तो होना आवश्यक है (यह सरलीकरण ओर इशारा करते हुए के लिए @docendodiscimus करने के लिए धन्यवाद) के साथ na.rm=TRUEcolSums बुला रहा है:

colSums(do.call(rbind, lst[as.character(agg.nam)]), na.rm=TRUE) 
# [1] 3 3 6 0 2 1 

यदि मैट्रिक्स में कई पंक्तियां थीं, तो उपरोक्त सरलीकरण वास्तव में काम नहीं करेगा, और निम्नलिखित चाल बेहतर होगा:

# Grab relevant list elements 
mats <- lst[as.character(agg.nam)] 

# Replace any instance of NA with 0 
mats <- lapply(mats, function(x) { x[is.na(x)] <- 0 ; x }) 

# Sum them up 
Reduce("+", mats) 
#  [,1] [,2] [,3] [,4] [,5] [,6] 
# [1,] 3 3 6 0 2 1 
1

1) abind यह काम करता है भले ही घटक matrices एकल पंक्ति matrices नहीं हैं। abind sublist L से 3 आयामी सरणी बनाता है और फिर sumna.rm = TRUE का उपयोग कर समांतर तत्वों के साथ लागू होता है।

library(abind) 

L <- lst[as.character(agg.nam)] 
apply(abind(L, along = 3), 1:2, sum, na.rm = TRUE) 

सवाल हम निम्न उत्पादन मैट्रिक्स पाने के इनपुट डेटा के मामले में:

 [,1] [,2] [,3] [,4] [,5] [,6] 
[1,] 3 3 6 0 2 1 

2) सरणी यह भी काम करता है और किसी भी संकुल का उपयोग नहीं करता। यह array का उपयोग करके 3 डी सरणी में L को दोबारा बदलकर छोड़कर काम करता है। L ऊपर से है।

make3d <- function(List) array(unlist(List), c(dim(List[[1]]), length(List))) 
apply(make3d(L), 1:2, sum, na.rm = TRUE) 

3) mapplymapply का उपयोग करते हुए इस एक समानांतर राशि है कि NAS को हटा परिभाषित करता है और उसके बाद Reduce का उपयोग कर इसे लागू होता है। कोई पैकेज उपयोग नहीं किया जाता है। L (1) से है।

psum <- function(x, y) array(mapply(sum, x, y, MoreArgs = list(na.rm = TRUE)), dim(x)) 
Reduce(psum, L) 

3a) के एक बदलाव (3) है:

sumNA <- function(...) sum(..., na.rm = TRUE) 
array(do.call(mapply, c(sumNA, L)), dim(L[[1]])) 
संबंधित मुद्दे