R:将矩阵列表中的 0 更改为 NA 的更简单方法?
R: Easier way to change 0s in list of matrices into NAs?
我想将列表的矩阵中的所有 0 转换为 NA。我想出了一种方法来完成这项任务。但是,它太复杂了,我认为应该有一种简单的方法来做到这一点。这里有一些示例数据:
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
重要的是原始矩阵已经将国家名称作为列名,因此与此列表 (ABlue) 匹配会很好。
这里是我目前使用的方式:
ABlue.df<-data.frame(do.call("rbind",ABlue)) # two step approach to replace 0 with NA according to: ""
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
想法如何减少线条和复杂性?谢谢
编辑: 我想要与原始数据中的结构相同!
您可以使用 replace
,像这样:
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
或者,正如@roland 建议的那样:
lapply(ABlue, function(x) {x[x == 0] <- NA; x})
或者,如果您有烟瘾:
library(purrr)
ABlue %>% map(~ replace(.x, .x == 0, NA))
我们也可以用for
.
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
我想知道除了 lapply
和 for
.
之外,我们还有其他函数来遍历列表吗
我想将列表的矩阵中的所有 0 转换为 NA。我想出了一种方法来完成这项任务。但是,它太复杂了,我认为应该有一种简单的方法来做到这一点。这里有一些示例数据:
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
重要的是原始矩阵已经将国家名称作为列名,因此与此列表 (ABlue) 匹配会很好。
这里是我目前使用的方式:
ABlue.df<-data.frame(do.call("rbind",ABlue)) # two step approach to replace 0 with NA according to: ""
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
想法如何减少线条和复杂性?谢谢
编辑: 我想要与原始数据中的结构相同!
您可以使用 replace
,像这样:
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
或者,正如@roland 建议的那样:
lapply(ABlue, function(x) {x[x == 0] <- NA; x})
或者,如果您有烟瘾:
library(purrr)
ABlue %>% map(~ replace(.x, .x == 0, NA))
我们也可以用for
.
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
我想知道除了 lapply
和 for
.