将列表转换为数据框而不弄乱数据

convert a list to data frame without messing with data

我有这样的列表数据

library(Matrix)
   
myd<- new("dgTMatrix", i = c(3L, 4L, 4L), j = 0:2, Dim = c(5L, 3L), 
        Dimnames = list(c("Xkr4", "Rp1", "Sox17", "Mrpl15", "Lypla1"
        ), c("AAAGTAGAGATGCCAG-1", "AACCGCGTCCAACCAA-1", "AACTCCCGTCGGGTCT-1"
        )), x = c(1, 2, 1), factors = list())

与列表相比,我更喜欢使用数据框,所以我尝试将其转换为数据框,但我不确定我是否正在破坏结构

我就是这样

mydf <- as.data.frame(myd)

然后变成这样

mydf<- structure(list(`AAAGTAGAGATGCCAG-1` = c(0, 0, 0, 1, 0), `AACCGCGTCCAACCAA-1` = c(0, 
0, 0, 0, 2), `AACTCCCGTCGGGTCT-1` = c(0, 0, 0, 0, 1)), class = "data.frame", row.names = c("Xkr4", 
"Rp1", "Sox17", "Mrpl15", "Lypla1"))

您认为转换这样的数据有更安全的方法吗?

我试图理解数据,所以如果我unlist它,它看起来像下面这样,但我仍然不确定转换

unlist(myd)
5 x 3 sparse Matrix of class "dgTMatrix"
       AAAGTAGAGATGCCAG-1 AACCGCGTCCAACCAA-1 AACTCCCGTCGGGTCT-1
Xkr4                    .                  .                  .
Rp1                     .                  .                  .
Sox17                   .                  .                  .
Mrpl15                  1                  .                  .
Lypla1                  .                  2                  1
 

这里有几个问题。首先,调用 as.data.frame(myd) 其中 myd 是具有 class dgTMatrix 的对象会引发错误,如下所示:

library(Matrix)

myd<- new("dgTMatrix", i = c(3L, 4L, 4L), j = 0:2, Dim = c(5L, 3L), 
          Dimnames = list(c("Xkr4", "Rp1", "Sox17", "Mrpl15", "Lypla1"
          ), c("AAAGTAGAGATGCCAG-1", "AACCGCGTCCAACCAA-1", "AACTCCCGTCGGGTCT-1"
          )), x = c(1, 2, 1), factors = list())

as.data.frame(myd)
#> Error in as.data.frame.default(myd): cannot coerce class 'structure("dgTMatrix", package = "Matrix")' to a data.frame

这是因为没有为 dgTMatrix 定义的 as.data.frame 方法。但是,为 dgTMatrix 定义了一个 as.matrix 方法,为 class matrix 定义了一个 as.data.frame 方法。所以,如果你最好的行动方案真的是在 dgTMatrixdata.frame 之间转换(我觉得它可能不是),你可能想做这样的事情:

library(Matrix)
   
myd<- new("dgTMatrix", i = c(3L, 4L, 4L), j = 0:2, Dim = c(5L, 3L), 
        Dimnames = list(c("Xkr4", "Rp1", "Sox17", "Mrpl15", "Lypla1"
        ), c("AAAGTAGAGATGCCAG-1", "AACCGCGTCCAACCAA-1", "AACTCCCGTCGGGTCT-1"
        )), x = c(1, 2, 1), factors = list())

mydf <- as.data.frame(as.matrix(myd))
mydf
#>        AAAGTAGAGATGCCAG-1 AACCGCGTCCAACCAA-1 AACTCCCGTCGGGTCT-1
#> Xkr4                    0                  0                  0
#> Rp1                     0                  0                  0
#> Sox17                   0                  0                  0
#> Mrpl15                  1                  0                  0
#> Lypla1                  0                  2                  1