R 按列id字符的子集聚合表中的项

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),转录本编号由(

我正在使用R处理一个基因表达数据集。我对编码相当陌生,所以如果我没有详细描述这个问题,请原谅我

我的数据集如下所示:

    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))