我正在使用R开发一个基因表达数据集,我对编码相当陌生,所以如果我没有详细描述这个问题,请原谅我。
我的数据集看起来如下所示:
GeneID Sample1 Sample2
Slc26a5-001 7 8
Slc26a5-002 1 2
Homer2-001 6 5
Slc26a5-200 8 10
基因名是ID (Slc26a5)的第一部分,转录本编号由(-001)表示。我需要找到一种方法,将所有不同的文本ids折叠在一起,并同时将它们各自的行相加。输出将如下所示:
GeneID Sample1 Sample2
Slc26a5 16 20
Homer2 6 5
聚合函数应该可以根据基因ID将行相加,但是由于我不知道如何在聚合函数中仅用它们的名字的第一部分来引用基因id,所以我被困住了。
有人知道怎么做吗?
谢谢你的帮忙!
发布于 2016-08-23 10:27:47
主要是删除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))
发布于 2016-08-23 10:26:18
我们可以使用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文章中,它是行名。
如果它是一个以'GeneID‘作为列而不是作为row.names
的GeneID,那么使用hadleyverse
的一个有效选项是按分隔符对'GeneID’列进行separate
,按'GeneID‘分组,然后用summarise_each
获取所有列的sum
。
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
,我们将'data.frame‘转换为' Data.table’(setDT(df2)
),通过分隔符将'GeneID‘转化为’GeneID‘,循环遍历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))
https://stackoverflow.com/questions/39108250
复制