【生信技能树】2019-12-22作业:自定义函数实现melt和dcast功能

rm(list=ls())
options(stringsAsFactors = F)
##载入测试数据
load('example.Rdata')
a
#          GSM3781295 GSM3781296 GSM3781297 GSM3781298
#NM_214711   1.972502   1.939664   2.047662   2.208423
#NM_214710   2.688776   3.037042   5.280936   3.070719
#NM_214462   6.311992   1.704874   7.960758   1.901060
#NM_214461   6.102595   3.608155   6.625782   3.861742
library(reshape2)
aa <- a
aa$probe_id <- rownames(aa)
b <- melt(data = aa,
          id.vars = c("probe_id"),
          variable.name = "samples",
          value.name = "exprs")
b$samples <- as.character(b$samples)
b
#    probe_id    samples    exprs
#1  NM_214711 GSM3781295 1.972502
#2  NM_214710 GSM3781295 2.688776
#3  NM_214462 GSM3781295 6.311992
#4  NM_214461 GSM3781295 6.102595
#5  NM_214711 GSM3781296 1.939664
#6  NM_214710 GSM3781296 3.037042
#7  NM_214462 GSM3781296 1.704874
#8  NM_214461 GSM3781296 3.608155
#9  NM_214711 GSM3781297 2.047662
#10 NM_214710 GSM3781297 5.280936
#11 NM_214462 GSM3781297 7.960758
#12 NM_214461 GSM3781297 6.625782
#13 NM_214711 GSM3781298 2.208423
#14 NM_214710 GSM3781298 3.070719
#15 NM_214462 GSM3781298 1.901060
#16 NM_214461 GSM3781298 3.861742
save(b,file = 'b.Rdata')

melt_by_cat <- function(df) {
  df_new <- data.frame()
  for (i in 1:ncol(df)) {
    tmp <- as.data.frame(df[,i])
    colnames(tmp) <- c("exprs")
    tmp$probe_id <- rownames(df)
    tmp$samples <- colnames(df)[i]
    df_new <- rbind(df_new,tmp)
  }
  index <- c('probe_id','samples','exprs')
  df_new <- df_new[index]
  return(df_new)
}
re1 <- melt_by_cat(a)
##判断re1和b是否一致
identical(b,re1)
#[1] TRUE

d <- dcast(data = b, probe_id ~samples)
d
#   probe_id GSM3781295 GSM3781296 GSM3781297 GSM3781298
#1 NM_214461   6.102595   3.608155   6.625782   3.861742
#2 NM_214462   6.311992   1.704874   7.960758   1.901060
#3 NM_214710   2.688776   3.037042   5.280936   3.070719
#4 NM_214711   1.972502   1.939664   2.047662   2.208423

dcast_by_cat <- function(df0) {
  sp_index <- unique(df0$samples)
  create_df <- function(x,index,i) {
    df <- x[x$samples == index[i],]
    df <- df[,-2]
    colnames(df)[2] <- index[i]
    return(df)
  }
  dcast_df <- create_df(df0,sp_index,1)
  for (i in 2:length(sp_index)) {
    tmp <- create_df(df0,sp_index,i)
    dcast_df <- merge(dcast_df,tmp)
  }
  return(dcast_df)
}
re2 <- dcast_by_cat(b)
##判断re2和d结果是否一致
identical(d,re2)
#[1] TRUE

收获:

  1. 学习了melt()dcast()最基本的用法
    1)melt()得到的数据框,总行数=原数据框行数*列数,
    每行3个数据,分别对应原数据框每个单元格的行名,列名,数值
    b <- melt(data = aa,id.vars = c("probe_id"),variable.name = "samples",value.name = "exprs")

    2)dcast()得到的数据框,
    d <- dcast(data = b,probe_id ~samples)
    以~号前的列做行名,~号后为列名,重排数据

存在问题:

  1. 还是未能掌握apply函数的使用方法,尝试使用apply()改写melt(),得到的结果是一个List
melt_by_cat_2 <- function(df) {
  df_new <- data.frame()
  id <- 0
  df_new <- apply(df,2,function(x){
    tmp <- as.data.frame(x)
    colnames(tmp) <- c("exprs")
    tmp$probe_id <- rownames(df)
    id <- id + 1
    tmp$samples <- colnames(df)[id]
    tmp <- as.data.frame(tmp)
    df_new <- as.data.frame(rbind(df_new,tmp))
  })
  return(df_new)
}
re <- melt_by_cat_2(a)
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 217,734评论 6 505
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,931评论 3 394
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,133评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,532评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,585评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,462评论 1 302
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,262评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,153评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,587评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,792评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,919评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,635评论 5 345
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,237评论 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,855评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,983评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,048评论 3 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,864评论 2 354

推荐阅读更多精彩内容

  • pyspark.sql模块 模块上下文 Spark SQL和DataFrames的重要类: pyspark.sql...
    mpro阅读 9,453评论 0 13
  • 以下是B站生信技能树GEO数据库挖掘的课程笔记 主要内容及学习目的: 介绍GEO数据库:了解数据存放位置; 介绍G...
    黄晶_id阅读 49,043评论 66 382
  • ORA-00001: 违反唯一约束条件 (.) 错误说明:当在唯一索引所对应的列上键入重复值时,会触发此异常。 O...
    我想起个好名字阅读 5,317评论 0 9
  • 使用GEOquery包 肖恩戴维斯 2014年9月21日 1GEO概述 1.1平台 1.2样品 1.3系列 1.4...
    Greatji阅读 958评论 0 1
  • 最近遇到了一件怪事,我写的一篇文章收到58个赞的同时收获了39个踩。 文章链接:面试大于工作 仔细看了评论,评论区...
    修行是场梦阅读 1,430评论 23 19