R 按列id字符的子集聚合表中的项
我正在使用R处理一个基因表达数据集。我对编码相当陌生,所以如果我没有详细描述这个问题,请原谅我 我的数据集如下所示:R 按列id字符的子集聚合表中的项,r,R,我正在使用R处理一个基因表达数据集。我对编码相当陌生,所以如果我没有详细描述这个问题,请原谅我 我的数据集如下所示: GeneID Sample1 Sample2 Slc26a5-001 7 8 Slc26a5-002 1 2 Homer2-001 6 5 Slc26a5-200 8 10 基因名是ID的第一部分(Slc26a5),转录本编号由(
GeneID Sample1 Sample2
Slc26a5-001 7 8
Slc26a5-002 1 2
Homer2-001 6 5
Slc26a5-200 8 10
基因名是ID的第一部分(Slc26a5),转录本编号由(-001)表示。我需要找到一种方法将所有不同的转录本ID折叠在一起,同时对它们各自的行求和。输出如下所示:
GeneID Sample1 Sample2
Slc26a5 16 20
Homer2 6 5
聚合函数应该能够根据gene ID将行相加。但是,我被卡住了,因为我无法理解如何仅通过聚合函数中名称的第一部分引用gene ID
有人知道怎么做吗
谢谢你的帮助 我们可以使用
rowsum
。为了便于理解,我们将其拆分为多行(尽管可以在一行中完成)
或者使用
data.table
,我们将'data.frame'转换为'data.table'(setDT(df2)
),通过分隔符拆分'GeneID',循环遍历data.table的子集并得到和
library(data.table)
setDT(df2)[, lapply(.SD, sum),.(GeneID=tstrsplit(GeneID, "-")[[1]])]
# GeneID Sample1 Sample2
#1: Slc26a5 16 20
#2: Homer2 6 5
注:以上两种解决方案将非常有效
数据
df2主要的事情是删除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))
df Hi DSS,我使用了您的第一个答案聚合(.~cbind(GeneName=sub(“-.*”,”,rownames(df))),df,sum)谢谢!嗨,DSS-哦,好眼睛。起初我没有注意到,但你是对的。您的第二个解决方案更好,并且不会生成额外的列rowsum(df,sub(“-*”,”,rownames(df))@Paul-最好将dput(df)
的输出粘贴到您的问题中,向我们显示数据的确切结构,这样我们就可以得到100%的正确性。显示的数据有三列,没有行名称。
aggregate(df[-1], list(GeneID = sub("-.*", "", df$GeneID)), sum)
# GeneID Sample1 Sample2
# 1 Homer2 6 5
# 2 Slc26a5 16 20
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))