我正在研究使用R的基因表达数据集。我对编码很新,所以如果我没有详细描述问题,请原谅我。
我的数据集看起来像这样:
GeneID Sample1 Sample2
Slc26a5-001 7 8
Slc26a5-002 1 2
Homer2-001 6 5
Slc26a5-200 8 10
基因名称是ID的第一部分(Slc26a5),转录本编号由(-001)表示。我需要找到一种方法将所有不同的转录标识符折叠在一起并同时对各自的行进行求和。输出如下所示:
GeneID Sample1 Sample2
Slc26a5 16 20
Homer2 6 5
Aggregate函数应该用于根据基因ID将行汇总在一起。但是我被困了,因为我无法弄清楚如何仅通过聚合函数内部名称的第一部分来引用基因id。
有谁知道怎么做?
感谢您的帮助!
答案 0 :(得分:1)
我们可以使用rowsum
。为了便于理解,我们在这里将它分成多行(尽管可以在一行中完成)
m1 <- as.matrix(df1)
row.names(m1) <- sub("-.*", "", row.names(df1))
rowsum(m1, group = row.names(m1))
# Sample1 Sample2
#Homer2 6 5
#Slc26a5 16 20
注意:在未经编辑的OP的帖子中,它是rownames。
如果是data.frame
,其中包含&#39; GeneID&#39;作为列而不是row.names
,hadleyverse
的一个有效选项是separate
&#39; GeneID&#39;分隔符列,分组&#39; GeneID&#39;并使用sum
获取所有列的summarise_each
。
library(dplyr)
library(tidyr)
separate(df2, GeneID, "GeneID") %>%
group_by(GeneID) %>%
summarise_all(funs(sum))
# GeneID Sample1 Sample2
# <chr> <int> <int>
#1 Homer2 6 5
#2 Slc26a5 16 20
或者使用data.table
,我们会转换&#39; data.frame&#39;到&#39; data.table&#39; (setDT(df2)
),split
&#39; GeneID&#39;通过分隔符,遍历Data.table的子集并获取sum
。
library(data.table)
setDT(df2)[, lapply(.SD, sum),.(GeneID=tstrsplit(GeneID, "-")[[1]])]
# GeneID Sample1 Sample2
#1: Slc26a5 16 20
#2: Homer2 6 5
注意:上述两种解决方案效率很高
df2 <- structure(list(GeneID = c("Slc26a5-001", "Slc26a5-002", "Homer2-001",
"Slc26a5-200"), Sample1 = c(7L, 1L, 6L, 8L), Sample2 = c(8L,
2L, 5L, 10L)), .Names = c("GeneID", "Sample1", "Sample2"),
class = "data.frame", row.names = c(NA, -4L))
答案 1 :(得分:1)
主要是删除GeneID
列的尾部,以便您对分组进行标准化。以下使用sub()
完成此操作。然后它几乎只是标准聚合。使用aggregate()
,以下内容即可完成。
aggregate(df[-1], list(GeneID = sub("-.*", "", df$GeneID)), sum)
# GeneID Sample1 Sample2
# 1 Homer2 6 5
# 2 Slc26a5 16 20
我们也可以使用rowsum()
,而不是不必要地转换任何数据。
rowsum(df[-1], sub("-.*", "", df$GeneID))
# Sample1 Sample2
# Homer2 6 5
# Slc26a5 16 20
数据:强>
df <- structure(list(GeneID = structure(c(2L, 3L, 1L, 4L), .Label = c("Homer2-001",
"Slc26a5-001", "Slc26a5-002", "Slc26a5-200"), class = "factor"),
Sample1 = c(7L, 1L, 6L, 8L), Sample2 = c(8L, 2L, 5L, 10L)), .Names = c("GeneID",
"Sample1", "Sample2"), class = "data.frame", row.names = c(NA,
-4L))