2015-12-18 13 views
9

Ich möchte alle Nullen in den Matrizen einer Liste in NAs konvertieren. Ich habe einen Weg gefunden, wie ich diese Aufgabe erfüllen kann. Es ist jedoch zu komplex und ich denke, dass es einen einfachen Weg geben sollte, wie es gemacht wird. Hier einige Beispieldaten:R: Einfacher Weg, um 0s in der Liste der Matrizen in NAs zu ändern?

ABlue <- list("111.2012"=matrix(c(1, 0, 6, 0, 1, 0), 
          nrow = 1, byrow = T), 
      "112.2012"=matrix(c(6, 2, 2, 0, 3, 1), 
          nrow = 1, byrow = T), 
      "111.2011"=matrix(c(3, 2, 0, 0, 1, 9), 
          nrow = 1, byrow = T), 
      "112.2011"=matrix(c(1, 2, 0, 0, 7, 0), 
          nrow = 1, byrow = T)) 
CNTRYs <- c("USA", "GER", "UK", "IT", "CND", "FRA") 
ABlue <- lapply(ABlue , "colnames<-", CNTRYs) # gets names from Country list 

Wichtig ist, dass die ursprünglichen Matrizen haben bereits Ländernamen wie COLNAMES, so wäre es schön, mit dieser Liste (ablue) übereinstimmen.

Hier ist die Art, wie ich bis jetzt verwenden:

ABlue.df<-data.frame(do.call("rbind",ABlue)) # two step approach to replace 0 with NA according to: "http://stackoverflow.com/questions/22870198/is-there-a-more-efficient-way-to-replace-null-with-na-in-a-list" 
ABlue.df.withNA <- sapply(ABlue.df, function(x) ifelse(x == 0, NA, x)) 
ABlueNA <- split(ABlue.df.withNA, 1:NROW(ABlue.df.withNA)) # is again a list (of vectors) 
names(ABlueNA) <- names(ABlue) # list with old names 
ABlueNAdf <- lapply(ABlueNA, function(x) as.data.frame(x)) # turned into list of dfs of one column 
ABlueNAdfT <- lapply(ABlueNAdf, function(x) t(x)) # transponed to list of dfs of one row and 206 cols 
ABlueNAdfTnam <- lapply(ABlueNAdfT , "colnames<-", CNTRYs) # gets names from Country list 
ABlueNAdfTnam <- lapply(ABlueNAdfTnam , "rownames<-", 1:NROW(ABlueNAdfTnam[1])) 
ABlue2 <- ABlueNAdfTnam 

Ideen, wie Linien und Komplexität zu reduzieren? Danke

Edit: Ich möchte die gleiche Struktur wie in den ursprünglichen Daten haben!

Antwort

17

können Sie replace verwenden, wie folgt aus:

lapply(ABlue, function(x) replace(x, x == 0, NA)) 
# $`111.2012` 
#  USA GER UK IT CND FRA 
# [1,] 1 NA 6 NA 1 NA 
# 
# $`112.2012` 
#  USA GER UK IT CND FRA 
# [1,] 6 2 2 NA 3 1 
# 
# $`111.2011` 
#  USA GER UK IT CND FRA 
# [1,] 3 2 NA NA 1 9 
# 
# $`112.2011` 
#  USA GER UK IT CND FRA 
# [1,] 1 2 NA NA 7 NA 

Oder, wie @roland vorgeschlagen:

lapply(ABlue, function(x) {x[x == 0] <- NA; x}) 

Oder, wenn Sie eine Pfeife Sucht:

library(purrr) 
ABlue %>% map(~ replace(.x, .x == 0, NA)) 
+4

das ist im Grunde genommen "lapply (ABlue, Funktion (x) {x [x == 0] <- NA; x})". – Roland

+0

Das ist einfach, danke. Ich liebe SO :) –

+0

@ N.Varela, kein Problem. Vielen Dank, dass Sie ein reproduzierbares Beispiel gepostet und Ihre bereits gemachten Versuche gezeigt haben. – A5C1D2H2I1M1N2O1R2T1

0

Wir kann auch for verwenden.

for (i in 1:length(ABlue)) { 
    ABlue[[i]][ABlue[[i]]==0] <- NA 
} 

ABlue 
# $`111.2012` 
#  USA GER UK IT CND FRA 
# [1,] 1 NA 6 NA 1 NA 
# 
# $`112.2012` 
#  USA GER UK IT CND FRA 
# [1,] 6 2 2 NA 3 1 
# 
# $`111.2011` 
#  USA GER UK IT CND FRA 
# [1,] 3 2 NA NA 1 9 
# 
# $`112.2011` 
#  USA GER UK IT CND FRA 
# [1,] 1 2 NA NA 7 NA 

Ich frage mich, haben wir keine andere Funktionen haben eine Liste mit Ausnahme lapply und for iterieren.