5

假设我有一个Tables用 colnames 和没有 rownames 调用的矩阵列表。

 Tables <- list(structure(c(0.810145949194718, 0.0792559803788517, 0.189854050805282, 
0.920744019621148), .Dim = c(2L, 2L), .Dimnames = list(NULL, 
    c("e", "prod"))), structure(c(0.949326264941026, 0.24010922539329, 
0.0506737350589744, 0.75989077460671), .Dim = c(2L, 2L), .Dimnames = list(
    NULL, c("prod", "e"))))

我希望行名与列名相同:

rownames(Tables[[1]])<- colnames(Tables[[1]])
rownames(Tables[[2]])<- colnames(Tables[[2]])

我试过使用lapply没有成功

lapply(Tables, function(x) rownames(x) <- colnames(x))

我设法使用for循环来做到这一点

for(i in 1:length(Tables)){
  rownames(Tables[[i]])<- colnames(Tables[[i]])
}

Tables # Expected result
[[1]]
              e      prod
e    0.81014595 0.1898541
prod 0.07925598 0.9207440

[[2]]
          prod          e
prod 0.9493263 0.05067374
e    0.2401092 0.75989077

尽管如此,我想找到一种方法来使用*applybase 中的任何或任何其他函数来避免for循环,但我无法在这个目标上取得成功。我读了这个,但我不知道如何使用这些解决方案。有什么建议吗??

4

4 回答 4

7
lapply(Tables, function(x){
  rownames(x) <- colnames(x)
  x
})

# [[1]]
#               e      prod
# e    0.81014595 0.1898541
# prod 0.07925598 0.9207440
# 
# [[2]]
#           prod          e
# prod 0.9493263 0.05067374
# e    0.2401092 0.75989077
于 2013-10-01T18:52:53.187 回答
5

另外的选择:

for (x in Tables) 
   data.table::setattr(x, "dimnames", list(colnames(x), colnames(x))) 


[[1]]
              e      prod
e    0.81014595 0.1898541
prod 0.07925598 0.9207440

[[2]]
          prod          e
prod 0.9493263 0.05067374
e    0.2401092 0.75989077
于 2013-10-01T19:18:52.890 回答
4

R 已经拥有你需要的一切 :-)

Tables <- Map(`rownames<-`, Tables, lapply(Tables, colnames))
于 2013-10-02T00:24:32.533 回答
1

这是一种方法:

lapply(seq_along(Tables), function(i) {
    rownames(Tables[[i]]) <<- colnames(Tables[[i]])
    return(invisible())
})

...这很丑 - 改用循环。或者,如果您确实想使用 lapply,请尝试:

Tables <- lapply(Tables, function(x) {
    rownames(x) <- colnames(x)
    return(x)
})

有人早些时候发布了这个,但他们似乎已经删除了他们的答案。

于 2013-10-01T18:58:00.083 回答