数据解释。关键点:(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()驱动的解决方案只会有更好的语法,但会很慢。
答案 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()
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()
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