利用aggregate函数整合TCGA中同一患者临床信息

该过程其实就是找到临床信息矩阵中,同一患者所在的行,然后用paste进行连接,你可以用for循环,可以用apply家族函数,还可以用 aggregate 函数。

上篇内容只是对单个因素(生存时间)进行统计整理,其实 aggregate 函数也支持对多个因素进行操作。如下,将同一患者的多个条目的信息(变量名为data)进行合并:

  1. aggregate(.~bcr_patient_barcode, data = data, paste, collapse = " /// ")

显示如下:

可见,”TCGA-BC-A10Y” 的信息被丢掉,因为对于该样本来说,days_to_last_followup均为NA!即,如果某行包含NA值,则该行将被排除

为了避免被排除,可将 aggregate 函数中的参数 na.action 设置为na.pass:

  1. aggregate(.~bcr_patient_barcode, data = data, paste, collapse = " /// ", na.action = na.pass)# 默认 na.omit

可见, “TCGA-BC-A10Y” 的信息被保留且合并,但是”NA /// NA” 和 ” /// 400″看起来并不美观。

所以,尝试排除为空(”” 或 NA)的元素。这里使用 function(x){} 的方式完成更复杂的功能:

  1. aggregate(.~bcr_patient_barcode, data = data, function(x) {paste(x[which(x!="" & !is.na(x))], collapse = " /// ")}, na.action = na.pass)

此时,即是我们预期的结果!

同样的样本,测试下其他的临床信息(变量名为data2):

按照上文所述,包含NA的行被排除,所以执行:

  1. aggregate(.~bcr_patient_barcode, data = data2, function(x) {paste(x[which(x!="" & !is.na(x))], collapse = " /// ")})

会报错:

Error in aggregate.data.frame(lhs, mf[-1L], FUN = FUN, …) : 没有可用来聚合的行

报错信息中,聚合是说针对同一样本的条目进行整合操作,而没有可用于聚合的行即表示针对每个样本,其数据都是空的,其实就是因为 days_to_last_followup 列和 days_to_death 列为互斥的,一个有数据另一个就是NA,所以在不设置 na.action = na.pass 的情况下,所有的行都被排除,也就是没有可用来聚合的行

综上,推荐在使用 aggregate 函数进行数据整合时添加 na.action = na.pass:

  1. aggregate(.~bcr_patient_barcode, data = data2, function(x) {paste(x[which(x!="" & !is.na(x))], collapse = " /// ")}, na.action = na.pass)

可见…仍然有问题,new_tumor_events 列变成了数值!

查看数据结构可知,data2 中的 new_tumor_events 列是因子型数据,并且!在函数体中使用x的时候,就已经被转化为数值,意味着无法在函数体中将其类型转换为字符串,故需要在使用 aggregate 函数之前,将数据转换为不包含因子型的数据框:

  1. data3 = as.data.frame(as.matrix(data2), stringsAsFactors = F)
  2. aggregate(.~bcr_patient_barcode, data = data3, function(x) {paste(x[which(x!="" & !is.na(x))], collapse = " /// ")}, na.action = na.pass)

最终结果显示如下:

综上,针对TCGA临床数据中,对应同一样本的多条记录合并,可用的脚本如下:

  1. data_tmp = as.data.frame(as.matrix(data_raw), stringsAsFactors = F)
  2. data_new = aggregate(.~bcr_patient_barcode, data = data_tmp, function(x) {
  3.        paste(x[which(x!="" & !is.na(x))], collapse = " /// ")
  4. }, na.action = na.pass)

而在此之前,完成相同工作的情况下,我的脚本如下:

  1. # 同一样本的多条记录合并,以///间隔
  2. data_new = data.frame(t(sapply(unique(data_raw$bcr_patient_barcode), function(p) {
  3.    pData = as.matrix(data_raw[which(data_raw$bcr_patient_barcode == p),])
  4.    apply(pData, 2, function(x){
  5.        str = paste(x[which(x!="" & !is.na(x))], collapse = " /// ")
  6.    })
  7. })), stringsAsFactors = FALSE)
  8. data_new$bcr_patient_barcode = unlist(lapply(data_new$bcr_patient_barcode, function(b) unique(strsplit(b, " /// ")[[1]])))
生物信息学

R语言fastStat包简介

2019-11-24 21:03:13

生物信息学

介绍几种上调的lncRNA调控下游mRNA的分子机制

2019-11-25 21:45:17

加入Q群
0 条回复 A文章作者 M管理员
    暂无讨论,说说你的看法吧
个人中心
今日签到
有新私信 私信列表
搜索