2016-01-21 20 views
5

मेरे पास दो सूचियां हैं और मैं उन्हें NA के संदर्भ में सुसंगत बनाना चाहता हूं। एनए रखें जब भी सूची की संरचना में किसी और चीज में बदलाव किए बिना दो सूचियों में से एक में एनए है।दो सूचियों में एनए से कैसे निपटें?

set.seed(123) 
m1 <- matrix(nrow=2,ncol=2,data=runif(4)) 
m1[1,1] <- NA 
m2 <- matrix(nrow=2,ncol=2,data=runif(4)) 
m2[1,2] <- NA 
lis <- list(m1, m2) 
m1 <- matrix(nrow=2,ncol=2,data=runif(4)) 
m2 <- matrix(nrow=2,ncol=2,data=runif(4)) 
m2[2,1] <- NA 
bis <- list(m1, m2) 

मैं इस कोशिश की, लेकिन कोई सफलता के साथ bis[is.na(lis)]=NA

वांछित उत्पादन:

> lis 
[[1]] 
      [,1]  [,2] 
[1,]  NA 0.9568333 
[2,] 0.4566147 0.4533342 

[[2]] 
     [,1]  [,2] 
[1,] 0.9404673  NA 
[2,] 0.0455565  NA 

    > bis 
[[1]] 
     [,1]  [,2] 
[1,]  NA 0.9568333 
[2,] 0.4566147 0.4533342 

[[2]] 
     [,1]  [,2] 
[1,] 0.6775706  NA 
[2,] 0.5726334  NA 

उत्तर

3

यहाँ एक विकल्प है:

z <- Map("|", lapply(lis, is.na), lapply(bis, is.na)) 
bis <- Map(function(mat, idx) {mat[idx] <- NA; mat}, bis, z) 
lis <- Map(function(mat, idx) {mat[idx] <- NA; mat}, lis, z) 

हालांकि, वहाँ तेजी से हो सकता है/और अधिक कुशल दृष्टिकोण कई Map औरके कारण 210 कॉल

# create a named list - naming is important if you want to 
# assign them back to the global environment later on 
mylist <- list(lis = lis, bis = bis, kis = kis) 

n <- max(lengths(mylist)) 
z <- lapply(1:n, function(i) { 
    Reduce(`+`, Map(function(y) is.na(y[[i]]), mylist))>0 
}) 

mylist <- lapply(mylist, function(mat) { 
    Map(function(m, idx) {m[idx] <- NA; m}, mat, z) 
}) 

# to assign them back to the global environment, run: 
list2env(mylist, envir = .GlobalEnv) 

अब अपने मूल सूचियों वैश्विक वातावरण में संशोधित कर रहे हैं:


> 2 सूचियों आप निम्नलिखित दृष्टिकोण (यह मानते हुए प्रत्येक सूची लम्बाई समान होती है कि) का उपयोग कर सकते के मामले के लिए

नमूना डेटा:

set.seed(123) 
n <- 4 
lis <- list(
    m1 = matrix(nrow=n,ncol=n,data=sample(c(NA, 1:10), n*n, TRUE)), 
    m2 = matrix(nrow=n,ncol=n,data=sample(c(NA, 1:10), n*n, TRUE)) 
) 
bis <- list(
    m1 = matrix(nrow=n,ncol=n,data=sample(c(NA, 1:10), n*n, TRUE)), 
    m2 = matrix(nrow=n,ncol=n,data=sample(c(NA, 1:10), n*n, TRUE)) 
) 
kis <- list(
    m1 = matrix(nrow=n,ncol=n,data=sample(c(NA, 1:10), n*n, TRUE)), 
    m2 = matrix(nrow=n,ncol=n,data=sample(c(NA, 1:10), n*n, TRUE)) 
) 
+0

पहली पंक्ति बदलें के साथ: 'z <- मानचित्र (Funct आयन (...) {डॉट्स <- as.list (...); arr <- do.call (abind, c (बिंदुओं, साथ = 3)); लागू करें (एआर, 1: 2, कोई भी)}, लापरवाही (lis, is.na), लापरवाही (बीआईएस, is.na)) '। मुझे लगता है कि काम करना चाहिए। हालांकि शायद धीमी है। 'Abind' पैकेज की आवश्यकता है। कुंजी 'किसी भी' के साथ '|' को बदल रहा है। – Bazz

+0

@Bazz, कृपया आगे बढ़ें और इसे अपने उत्तर में जोड़ें। मैं देखूंगा कि मुझे एक अलग दृष्टिकोण मिल सकता है –

+0

यह आपके उत्तर का अनुकूलन है, मेरा नहीं। 'as.list' सिर्फ 'सूची' होना चाहिए। – Bazz

4

Map का उपयोग करते हुए एक NA रूप NA पदों के साथ मैट्रिक्स की सूची बनाने के लिए:

naposmtx <- Map(function(mtx1, mtx2){ 
    nasmtx <- mtx1 + mtx2 # because NA + non-NA = NA 
    nasmtx[!is.na(nasmtx)] <- 0 
    nasmtx 
}, lis, bis) 

तब:

lis <- Map(`+`, lis, naposmtx) 
bis <- Map(`+`, bis, naposmtx) 
+0

अच्छा विकल्प, मैंने अपने समाधानों को बेंचमार्क किया और वे समान रूप से तेज़ दिखाई देते हैं (+1) –

+0

धन्यवाद। मैं 'मैप' फ़ंक्शन को ध्यान में रखूंगा - यह मेरे लिए नया है। – Bazz

+0

यह 'सरलीकृत = FALSE' –

संबंधित मुद्दे