美文网首页ggplot集锦
R循环追加数据到数据框

R循环追加数据到数据框

作者: 生信云笔记 | 来源:发表于2020-07-20 21:11 被阅读0次

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')

最后

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

相关文章

  • R循环追加数据到数据框

    list转化为data.frame   在数据处理过程中会遇到各式各样的要求,格式转换、数据结构重构等需求可以说是...

  • R语言与生信应用11-R语法-数据框dataframe与R对象的

    数据框dataframe与R对象的命名 数据框dataframe 数据框用来储存表格型的数据 数据框是一种特殊类型...

  • 四、文件读写

    1.文件读写 (1)文件写入 表格文件读入R语言里,就是数据框,对数据框的修改不会同步到表格文件 (2)将数据框导...

  • 2019-07-18听课总结

    内容 • 循环-数组|数据框• 循环-因子• 循环-while| if else• 数据处理-排序|集合|长宽• ...

  • R中将循环产生的数据框合并

    1.问题 今天利用R写循环的时候出现了一个问题,循环内会产生多个数据框,希望将这多个数据库合并并生产一个最终的数据...

  • Part 4:文件读写

    Part 4:文件读写 1.认识csv格式 表格文件读入到R语言里,就是个数据框 对数据框进行的修改不会同步到表格...

  • R语言--高效操作数据框(dplyr包)(1)

    数据框是R语言中的一个重要数据结构,在数据分析过程中,主要的数据对象就是数据框。R语言内置了data.frame类...

  • R——数据框

    新建与读取数据框 新建数据框 读取数据框 数据框的属性 数据框取子集 数据框编辑 两个表格的连接 删除 元素的名字...

  • 2019-08-10 Day-5 杜诗蓓

    今日重点:R语言数据类型:向量和数据框

  • 学习小组Day5笔记--没有眼镜

    R的数据结构 向量&数据框 使用数据框中的变量作图 关于stringsAsFactors:用read.table和...

网友评论

    本文标题:R循环追加数据到数据框

    本文链接:https://www.haomeiwen.com/subject/zarykktx.html