R循环追加数据到数据框

list转化为data.frame

  在数据处理过程中会遇到各式各样的要求,格式转换、数据结构重构等需求可以说是家常便饭了,所以R语言本身也提供了很多数据格式转换的函数或者第三个的包,如基础函数as.vector、as.list、as.data.frame等,这些函数都可以将数据转换为相应的格式,或者使用相应的包来实现。不过有时候对于自己的数据,基础的函数没法满足要求,本身挺容易实现的,又不想浪费很多时间上网找R包,这个时候就得自己来实现了,毕竟做分析还是要学会一些数据处理的技巧来应对这些尴尬的时刻。比如我最近在研究分析单细胞的R包metacell时,就遇到了一个问题,我想把其中的结果(嵌套list)转化为data.frame存储下来,基础函数没法完成,又不知道有没有其他能实现的包,只能靠自己了。。。
  废话不多说,下面来看看我的具体要求和实现过程。首先来看一下原始的嵌套list内容:

#从summary命令的结果可以看出列表mc_sup包含6个子列表
> summary(mc_sup)
     Length Class  Mode
[1,] 7      -none- list
[2,] 7      -none- list
[3,] 7      -none- list
[4,] 7      -none- list
[5,] 7      -none- list
[6,] 7      -none- list
#用str命名查看一下列表mc_sup的结构,可得知内部的子列表结构结构一致都是包含7个元素的list
>str(mc_sup)
List of 6
 $ :List of 7
  ..$ marks         : Named num [1:20] 1.25 1.26 1.26 1.33 1.34 ...
  .. ..- attr(*, "names")= chr [1:20] "PIK3IP1" "LTB" "CD247" "CD2" ...
  ..$ min_marks     : Named num [1:20] 1.02 1.04 1.08 1.18 1.25 ...
  .. ..- attr(*, "names")= chr [1:20] "PRKCQ-AS1" "CD27" "CD2" "CD6" ...
  ..$ marks_gap     : Named num [1:20] 1.25 1.27 1.27 1.31 1.36 ...
  .. ..- attr(*, "names")= chr [1:20] "LCK" "RPS18" "RCAN3" "RPS27" ...
  ..$ marks_gap_anti: Named num [1:20] -3.57 -3.36 -3.09 -2.92 -2.63 ...
  .. ..- attr(*, "names")= chr [1:20] "HLA-DRA" "S100A9" "S100A8" "CD74" ...
  ..$ mcs           : int [1:2] 2 1
  ..$ x_ord         : num 1.5
  ..$ sup_mcs       : int [1:10] 8 7 9 10 6 5 4 3 2 1
 $ :List of 7
  ..$ marks         : Named num [1:20] 1.45 1.53 1.63 1.73 1.76 ...
  .. ..- attr(*, "names")= chr [1:20] "CST7" "ARL4C" "GNLY" "GZMM" ...
  ..$ min_marks     : Named num [1:20] 0.744 0.748 0.749 0.808 0.87 ...
  .. ..- attr(*, "names")= chr [1:20] "GZMM" "PRKCH" "ZAP70" "PRKCQ-AS1" ...
  ..$ marks_gap     : Named num [1:20] 1.72 1.73 1.78 1.83 1.86 ...
  .. ..- attr(*, "names")= chr [1:20] "ARL4C" "GZMM" "TRBC1" "CD247" ...
  ..$ marks_gap_anti: Named num [1:20] -4.66 -4.44 -4.1 -3.44 -3.21 ...
  .. ..- attr(*, "names")= chr [1:20] "HLA-DRA" "S100A9" "S100A8" "CD74" ...
  ..$ mcs           : int [1:4] 4 3 2 1
  ..$ x_ord         : num 2.5
  ..$ sup_mcs       : int [1:10] 8 7 9 10 6 5 4 3 2 1

#现在需要把上面的列表mc_sup输出为数据框,格式如下:
> marks_info[1,1:3]
  id  mcs  sup_mcs  x_ord  marks   min_marks  marks_gap  marks_gap_anti  
1  2,1  8,7,6,5,4,3,2,1  1.5  PIK3IP1:1.251;LTB:1.256;  PRKCQ-AS1:1.017;CD27:1.039;   LCK:1.252;RPS18:1.261;  DPA1:-2.62;CTSS:-2.42;

代码实现

  大家应该明白我的具体实现要求了吧,就是把内层list的内容都变成数据框对应的一列,可以外层list有6个元素,内层list有7个元素,外层list的元素顺序变成数据框的id内容,最终转化为6行X8列的数据框。其中带字段‘marks’的列要复杂一点,需要将gene名和对应的值用‘:’链接起来,不同的gene用‘; ’分割,比如"CST7:1.45; ARL4C:1.53"。格式的转换的问题解决了,下面就是如何循环向data.frame里面循环写入数据了,我这里采用先第一个空的数据框,然后将数据与其合并,如此循环下去来实现,下面是具体的代码:

#这里定义了一个函数,两个参数分别为上面所说的嵌套list和输出文件名
>export_marks_tab <- function(mc_sup,outname){
   df <- data.frame()  #此处一个空的数据框
   for(i in 1:length(mc_sup)){
      mcs <- paste(mc_sup[[i]]$mcs,collapse=',')
      sup_mcs <- paste(mc_sup[[i]]$sup_mc,collapse=',')
      x_ord <- mc_sup[[i]]$x_ord
      marks <- paste(names(mc_sup[[i]]$marks),mc_sup[[i]]$marks,sep=':',collapse='; ')
      min_marks <- paste(names(mc_sup[[i]]$min_marks),mc_sup[[i]]$min_marks,sep=':',collapse='; ')
      marks_gap <- paste(names(mc_sup[[i]]$marks_gap),mc_sup[[i]]$marks_gap,sep=':',collapse=';')
      marks_gap_anti <- paste(names(mc_sup[[i]]$marks_gap_anti),mc_sup[[i]]$marks_gap_anti,sep=':',collapse='; ')
      #此处采用行合并的方式将数据与空的数据框合并,相当于向数据框追加数据,然后生成的数据框替代原先的数据框
      df <- rbind(df,data.frame(id=i,mcs=mcs,sup_mcs=sup_mcs,x_ord=x_ord,marks=marks,min_marks=min_marks,marks_gap=marks_gap,marks_gap_anti=marks_gap_anti))
   }
   write.table(df,outname,quote=F,row.names=F,col.names=T,sep='\t')
}
#调用函数
>export_marks_tab(mc_sup,'pbmc_hcluster_info.txt')

最后

  写一个自定的函数就可以完成需求了,写成函数方便调用和代码复用,是不是很简单,你学会了么?各位看官们记得帮忙点赞啊!!!😉😉😉

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,242评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,769评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,484评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,133评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,007评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,080评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,496评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,190评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,464评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,549评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,330评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,205评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,567评论 3 298
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,889评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,160评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,475评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,650评论 2 335