1. sci666首页
  2. 实用技巧
  3. 生物信息学

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

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

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

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

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

显示如下:

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

可见,”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

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

可见, “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)

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

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

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

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

按照上文所述,包含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)

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

可见…仍然有问题,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)

最终结果显示如下:

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

综上,针对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]])))
①SCI666交流QQ群:医学综合科研群:703163967 · 生信分析群:732179952 · Meta分析群:797345521(点击群号即可加群)。
②下载提示:点击查看百度网盘会员共享账号,部分内容具有时效性,若文中的下载链接失效请留言反馈。

发表评论

登录后才能评论

联系我们

(857)626-2666

在线咨询:点击这里给我发消息

邮件:123456@whu.edu.cn

QR code