【问题标题】:Add new columns to every matrices in a list of matrices in R将新列添加到 R 中矩阵列表中的每个矩阵
【发布时间】:2014-10-21 08:32:13
【问题描述】:

我有一个包含 61 个矩阵的矩阵列表。下面是 61 个矩阵之一的示例。

list_matrix_Tanzania_Mod500
[[60]]
      LU_2000
 [1,]      12
 [2,]      12
 [3,]      12
 [4,]      12
 [5,]      12
 [6,]      12
 [7,]      12
 [8,]      12
 [9,]      12
[10,]      11
[11,]      11
[12,]      12
[13,]      11
[14,]      12
[15,]      12 

我想向矩阵列表的每个矩阵添加 10 个新列。添加这些新列后,我想为每个列指定一个标题名称,其值为NA"ID", "LU_1990", "CHLU_90_00", "LU_2005", "CHLU_00_05", "Tile", "UNIQ_ID", "AREA", "Sour_90_00", "Sour_00_05"

我现在想用几个矩阵填充矩阵列表 list_matrix_Tanzania_Modis:LU_Mod2000, LU_Mod2005 and list_matrix_Tanzania。我试过了,但该列没有很好地更新。例如,当我为 LU_Mod2005 运行 Mapcode 行时,LU_2000 的值会从矩阵中删除。

columnsToTransfer1 <- 'LU_2000'
columnsToTransfer2 <- 'LU_2005'
columnsToTransfer3<- ('ID', 'Tile', 'UNIQ_ID')

    Map(function(x,y,z) {x[,z] <- y[,z];x},
                list_matrix_Tanzania_Modis, LU_Mod2000, columnsToTransfer1)
    Map(function(x,y,z) {x[,z] <- y[,z];x},
        list_matrix_Tanzania_Modis, LU_Mod2005, columnsToTransfer2)
Map(function(x,y,z) {x[,z] <- y[,z];x},
    list_matrix_Tanzania_Modis, list_matrix_Tanzania, columnsToTransfer3)

这个技巧有效,但我想将矩阵列表的名称保留为 list_matrix_Tanzania_Modis

list_matrix_Tanzania_Modis1<- Map(function(x,y,z) {x[,z] <- y[,z];x},
            list_matrix_Tanzania_Modis, LU_Mod2000, columnsToTransfer1)
list_matrix_Tanzania_Modis2<-Map(function(x,y,z) {x[,z] <- y[,z];x},
    list_matrix_Tanzania_Modis1, LU_Mod2005, columnsToTransfer2)

【问题讨论】:

  • 那么,目前,您有一个包含 1 列矩阵的列表,并且您想要添加 10 个具有 NA 值的命名列?
  • 我试过了,但它不起作用。 list_matrix_Tanzania_Mod500 &lt;- lapply(list_matrix_Tanzania_Mod500, function(x){ x &lt;- c(2:11); return(x)})

标签: r list matrix


【解决方案1】:

如果我理解正确,一个简单的cbind 在创建一个正确尺寸的空矩阵后应该可以工作:

示例输入:

L <- list(matrix(1:3, ncol = 1, dimnames = list(NULL, "a")),
          matrix(1:5, ncol = 1, dimnames = list(NULL, "b")))
L
# [[1]]
#      a
# [1,] 1
# [2,] 2
# [3,] 3
# 
# [[2]]
#      b
# [1,] 1
# [2,] 2
# [3,] 3
# [4,] 4
# [5,] 5

您要添加的新列:

newcols <- c("ID", "LU_1990", "CHLU_90_00", "LU_2005", "CHLU_00_05",
             "Tile", "UNIQ_ID", "AREA", "Sour_90_00", "Sour_00_05")

使用lapply 循环浏览列表,将相关的空列添加到每个列表项。

myNewList <- lapply(L, function(x) {
  M <- matrix(NA, nrow = nrow(x), ncol = 10, dimnames = list(NULL, newcols))
  cbind(x, M)
})

myNewList
# [[1]]
#      a ID LU_1990 CHLU_90_00 LU_2005 CHLU_00_05 Tile UNIQ_ID AREA Sour_90_00 Sour_00_05
# [1,] 1 NA      NA         NA      NA         NA   NA      NA   NA         NA         NA
# [2,] 2 NA      NA         NA      NA         NA   NA      NA   NA         NA         NA
# [3,] 3 NA      NA         NA      NA         NA   NA      NA   NA         NA         NA
# 
# [[2]]
#      b ID LU_1990 CHLU_90_00 LU_2005 CHLU_00_05 Tile UNIQ_ID AREA Sour_90_00 Sour_00_05
# [1,] 1 NA      NA         NA      NA         NA   NA      NA   NA         NA         NA
# [2,] 2 NA      NA         NA      NA         NA   NA      NA   NA         NA         NA
# [3,] 3 NA      NA         NA      NA         NA   NA      NA   NA         NA         NA
# [4,] 4 NA      NA         NA      NA         NA   NA      NA   NA         NA         NA
# [5,] 5 NA      NA         NA      NA         NA   NA      NA   NA         NA         NA

【讨论】:

  • 它正在工作,但是当我调用 M 矩阵列表时,它说找不到对象。你知道为什么吗?
  • @SimonBesnard,M 在lapply 内部。使用myNewList &lt;- lapply(all-the-other-stuff)。然后您就可以通过调用myNewList 访问新列表。
  • 太棒了。感谢您的帮助。
  • @SimonBesnard,你最终想做什么? lapply(myList, function(x) x[, -1]) 应该删除第一列。但是,如果您只是不想以第一列开头,请不要cbind - 只需返回M(在我的答案中包含示例代码)。
  • 是的,我想在创建矩阵列表时删除第一列 LU_2000。返回函数运行良好。再次感谢
猜你喜欢
  • 1970-01-01
  • 2019-01-27
  • 2014-07-06
  • 2012-05-03
  • 2015-11-11
  • 1970-01-01
  • 1970-01-01
  • 2018-09-25
  • 1970-01-01
相关资源
最近更新 更多