任何将转录本矩阵转换为基因矩阵的智能解决方案?

时间:2014-12-15 12:00:59

标签: r algorithm transformation

数据解释。关键点:(i)单个转录本由行表示,ENTREZID列表示基因; (ii)行627和627具有相同的ENTREZID =>一对一关系::一个基因中的许多转录本;一个转录本只与一个基因有关。

> head(m.venn4[m.venn4[,2]>0,])
    Irradiation_fm toluene_fm Dioxin_fm formaldehyde_fm ENTREZID
81           FALSE       TRUE     FALSE           FALSE    46717
152          FALSE       TRUE      TRUE           FALSE    31055
615          FALSE       TRUE      TRUE            TRUE    31460
626          FALSE       TRUE      TRUE            TRUE    31464
627          FALSE       TRUE      TRUE            TRUE    31464
683          FALSE       TRUE     FALSE            TRUE    3152

任务。将转录本表转换为基因表,例如有类似的东西,这里我有整数,但as.logical(0)== FALSE,as.logical(3)== TRUE,所以很好

> df.sum[df.sum[,5] %in% c("46717", "31055", "31460", "31464", "31464", "31529"),]
    Irradiation_fm toluene_fm Dioxin_fm formaldehyde_fm ENTREZID
81               0          1         0               0    46717
152              0          1         1               0    31055
615              0          1         1               1    31460
461              0          2         2               2    31464
683              0          1         0               1    31529

研究。说实话,我给了它一个想法,但无法在一行中描述通用关键字中的任务。

我的解决方案。

####
#### tranform transcripts to genes
df.sum <- data.frame(Irradiation_fm=logical(),
                     toluene_fm=logical(),
                     Dioxin_fm=logical(), 
                     formaldehyde_fm=logical(),
                     ENTREZID=character(),
                     stringsAsFactors=FALSE)
dfit <- 1
for (id in unique(m.venn4$ENTREZID)) {
    if (length(m.venn4[m.venn4$ENTREZID==id,1]) > 1) {
        for (it in 1:4) {
            df.sum[dfit,it] <-  sum(m.venn4[m.venn4$ENTREZID==id,it])
        }
    } else {
        df.sum[dfit,1:4] <- m.venn4[m.venn4$ENTREZID==id,1:4]
    }
    df.sum[dfit,5] <- as.character(id)
    dfit <- dfit+1
}

m.sum <- matrix(,nrow=length(df.sum[,1]),ncol=4)

m.sum[,1] <- as.logical(df.sum[,1])
m.sum[,2] <- as.logical(df.sum[,2])
m.sum[,3] <- as.logical(df.sum[,3])
m.sum[,4] <- as.logical(df.sum[,4])
rownames(m.sum) <- df.sum[,5]
colnames(m.sum) <- c("Irradiation_fm", "toluene_fm", "Dioxin_fm", "formaldehyde_fm")

请求。您能否为以下代码展示一个非食人魔解决方案?我不喜欢我,因为它是愚蠢和缓慢的, - 所有人形生物的食人魔。我也觉得apply()驱动的解决方案只会有更好的语法,但会很慢。

2 个答案:

答案 0 :(得分:2)

您可以sum summarise_each包中dplyr每列(按ENTREZID分组)?TRUE。 &#34;逻辑向量在需要数值的上下文中被强制转换为整数向量&#34; (见library(dplyr) df %>% group_by(ENTREZID) %>% summarise_each(funs(sum)) # ENTREZID Irradiation_fm toluene_fm Dioxin_fm formaldehyde_fm # 1 3152 0 1 0 1 # 2 31055 0 1 1 0 # 3 31460 0 1 1 1 # 4 31464 0 2 2 2 # 5 46717 0 1 0 0 )。

{{1}}

答案 1 :(得分:0)

以下是所有答案的比较:

原始答案:

t.o1 <- Sys.time()
df.sum <- data.frame(Irradiation_fm=logical(),
                     toluene_fm=logical(),
                     Dioxin_fm=logical(), 
                     formaldehyde_fm=logical(),
                     ENTREZID=character(),
                     stringsAsFactors=FALSE)
dfit <- 1
for (id in unique(m.venn4$ENTREZID)) {
    if (length(m.venn4[m.venn4$ENTREZID==id,1]) > 1) {
        for (it in 1:4) {
            df.sum[dfit,it] <-  sum(m.venn4[m.venn4$ENTREZID==id,it])
        }
    } else {
        df.sum[dfit,1:4] <- m.venn4[m.venn4$ENTREZID==id,1:4]
    }
    df.sum[dfit,5] <- as.character(id)
    dfit <- dfit+1
}
t.o2 <- Sys.time()

dplyr:

t.dplyr1 <- Sys.time()
df.sum2 <- m.venn4 %>% group_by(ENTREZID) %>% summarise_each(funs(sum))
t.dplyr2 <- Sys.time()

骨料:

t.aggr1 <- Sys.time()
df.sum2 <- aggregate(. ~ ENTREZID, m.venn4, sum)
t.aggr2 <- Sys.time()

data.table

library(data.table) 
t.dt1 <- Sys.time()
df.sum2 <- setkey(setDT(m.venn4), ENTREZID)[, lapply(.SD, sum), ENTREZID]
t.dt2 <- Sys.time()

结果:

# Method     Runtime (sec)
# ========================
# ogre               54.55
# dplyr              0.011
# aggregate           0.42
# data.table         0.006