data.table R ;如何通过 fwrite 保留列表元素名称?

data.table R ; how to preserve list element name by fwrite?

我有以下列表 data.tables;

l[1:2]
$cluster1
           rn        p_val avg_log2FC pct.1 pct.2    p_val_adj
       <char>        <num>      <num> <num> <num>        <num>
  1: Adamts20 1.438101e-65   1.030705 0.001 0.118 4.314302e-62
  2:      Gal 3.233897e-54  16.358484 0.006 0.208 9.701690e-51
  3:     Hrnr 1.295286e-51  14.374645 0.007 0.182 3.885858e-48
  4:      Ngb 4.143060e-44   1.925631 0.021 0.240 1.242918e-40
  5:    Svep1 3.872262e-41   8.232291 0.283 0.582 1.161679e-37
 ---                                                          
366:   Cyfip2 1.468792e-05   2.417948 0.056 0.118 4.406375e-02
367:   Fcgr2b 1.505992e-05  -4.719973 0.231 0.148 4.517976e-02
368:      Ogn 1.538930e-05   9.708295 0.242 0.339 4.616791e-02
369:   Lrrc15 1.549036e-05  -2.966498 0.241 0.352 4.647109e-02
370: AY036118 1.624054e-05   2.602963 0.715 0.788 4.872162e-02

$cluster2
                rn         p_val avg_log2FC pct.1 pct.2     p_val_adj
            <char>         <num>      <num> <num> <num>         <num>
  1:        Samd13 1.841651e-127  8.7785032 0.001 0.144 5.524952e-124
  2:         Gata1  2.210414e-99 17.0522687 0.002 0.126  6.631242e-96
  3:        Col4a4  1.250827e-58  9.6145811 0.583 0.254  3.752481e-55
  4:           Bsx  4.028430e-54 18.2214242 0.202 0.568  1.208529e-50
  5:        Gimap3  4.650536e-53 -1.6106639 0.017 0.255  1.395161e-49
 ---                                                                 
217:          Cd3e  1.452524e-05 18.6983055 0.131 0.175  4.357573e-02
218:       Selenom  1.455810e-05  0.9648215 0.293 0.201  4.367429e-02
219: A330069E16Rik  1.469167e-05 -5.4387846 0.388 0.282  4.407501e-02
220:         Lypd1  1.560834e-05 -2.1249661 0.176 0.100  4.682501e-02
221:          Alad  1.633998e-05 -1.1929284 0.226 0.175  4.901995e-02

我想通过 fwrite 将此列表导出到 csv 文件。我 运行 以下代码;

lapply(l[1:2], function(x) fwrite(as.data.table(x), "DGE.csv"))

生成的 csv 文件没有列表元素名称 $cluster1 和 $cluster。有没有什么方法可以使用 fwrite 添加列表元素名称作为每个元素列表和列 header 的 header 作为所需的输出?;

cluster1
   rn   p_val   avg_log2FC  pct.1   pct.2   p_val_adj
Samd13  1.84E-127   8.778503219 0.001   0.144   5.52E-124
Gata1   2.21E-99    17.05226868 0.002   0.126   6.63E-96
Col4a4  1.25E-58    9.614581115 0.583   0.254   3.75E-55
Bsx     4.03E-54    18.22142419 0.202   0.568   1.21E-50
Gimap3  4.65E-53    -1.61066387 0.017   0.255   1.40E-49
Gm26825 9.54E-51    12.96067221 0.341   0.596   2.86E-47
Erfe    3.72E-48    11.74946067 0.007   0.156   1.12E-44




cluster2
    rn  p_val   avg_log2FC  pct.1   pct.2   p_val_adj
Samd13  1.63E-12    15.05539372 0.038   0.141   4.90E-09
Frmd5   1.75E-12    -1.28277874 0.154   0.318   5.26E-09
Pla2g2f 2.06E-12    -1.51234633 0.142   0.056   6.17E-09
Aldh1a2 2.25E-12    5.127605606 0.274   0.426   6.75E-09
Fxyd2   2.51E-12    5.246386986 0.626   0.805   7.53E-09
Adam30  3.15E-12    1.53746735  0.203   0.362   9.44E-09
Gpr35   3.15E-12    -3.18282304 0.691   0.516   9.46E-09
Il10rb  3.65E-12    1.473277609 0.42    0.598   1.10E-08
Gk5     3.72E-12    -14.0221264 0.177   0.074   1.12E-08
    .......

另一种编写单独文件的方法:将 list-name 作为列附加,然后 rbindlist 它们,写入它们,当您读取它们时,然后 split 在该列名称上。

示例数据:

library(data.table)
ZZ <- lapply(list(mt1=mtcars[1:3,], mt2=mtcars[4:6,]), as.data.table)
ZZ
# $mt1
#      mpg   cyl  disp    hp  drat    wt  qsec    vs    am  gear  carb
#    <num> <num> <num> <num> <num> <num> <num> <num> <num> <num> <num>
# 1:  21.0     6   160   110  3.90 2.620 16.46     0     1     4     4
# 2:  21.0     6   160   110  3.90 2.875 17.02     0     1     4     4
# 3:  22.8     4   108    93  3.85 2.320 18.61     1     1     4     1
# $mt2
#      mpg   cyl  disp    hp  drat    wt  qsec    vs    am  gear  carb
#    <num> <num> <num> <num> <num> <num> <num> <num> <num> <num> <num>
# 1:  21.4     6   258   110  3.08 3.215 19.44     1     0     3     1
# 2:  18.7     8   360   175  3.15 3.440 17.02     0     0     3     2
# 3:  18.1     6   225   105  2.76 3.460 20.22     1     0     3     1

追加、组合、写入:

fwrite(rbindlist(ZZ, idcol = "name"), "~/Downloads/ZZ.csv")

生成的文件,可以被任何原始 CSV 读取 reader:

name,mpg,cyl,disp,hp,drat,wt,qsec,vs,am,gear,carb
mt1,21,6,160,110,3.9,2.62,16.46,0,1,4,4
mt1,21,6,160,110,3.9,2.875,17.02,0,1,4,4
mt1,22.8,4,108,93,3.85,2.32,18.61,1,1,4,1
mt2,21.4,6,258,110,3.08,3.215,19.44,1,0,3,1
mt2,18.7,8,360,175,3.15,3.44,17.02,0,0,3,2
mt2,18.1,6,225,105,2.76,3.46,20.22,1,0,3,1

读入并恢复原始对象格式:

ZZ2 <- fread("ZZ.csv")
ZZ2 <- lapply(split(ZZ2, ZZ2$name), function(x) x[, name := NULL])
ZZ2
# $mt1
#      mpg   cyl  disp    hp  drat    wt  qsec    vs    am  gear  carb
#    <num> <int> <int> <int> <num> <num> <num> <int> <int> <int> <int>
# 1:  21.0     6   160   110  3.90 2.620 16.46     0     1     4     4
# 2:  21.0     6   160   110  3.90 2.875 17.02     0     1     4     4
# 3:  22.8     4   108    93  3.85 2.320 18.61     1     1     4     1
# $mt2
#      mpg   cyl  disp    hp  drat    wt  qsec    vs    am  gear  carb
#    <num> <int> <int> <int> <num> <num> <num> <int> <int> <int> <int>
# 1:  21.4     6   258   110  3.08 3.215 19.44     1     0     3     1
# 2:  18.7     8   360   175  3.15 3.440 17.02     0     0     3     2
# 3:  18.1     6   225   105  2.76 3.460 20.22     1     0     3     1