【问题标题】:grouping data with the same name and applying function将同名数据分组并应用函数
【发布时间】:2013-10-02 09:14:11
【问题描述】:

我有这样的矩阵: 我想对具有相同名称的列进行分组,并将函数应用于矩阵的行。

>data

      A  A  A  B  B  C
gene1 1  6 11 16 21 26
gene2 2  7 12 17 22 27
gene3 3  8 13 18 23 28
gene4 4  9 14 19 24 29
gene5 5 10 15 20 25 30

基本上,我想将具有相同名称的列(如A)放入group 1B 放入group 2,...然后,我计算对所有组的每个基因进行 T 检验。 谁能帮助我我该怎么做?首先:分组,然后应用 T 检验,返回不同组之间每个基因的 T 分数。

【问题讨论】:

  • 你能不能dput(data) 并发布它的输出。另外,请分享您希望输出的方式。
  • 我想知道你如何在 R 中有同名的列!
  • @Ananda Mahto 我想要的输出:我想要的输出是:行是基因的表,列是组 i 与组 j,表的条目将是 T-第 i 组与第 j 组中基因 x 的得分。第一个问题是,我应该如何使与一个组同名的列?然后在那之后,我想计算所有可能组之间每个基因(行)的 T 检验
  • @user1436187,您可以使用矩阵,如果您使用check.names = FALSE,则可以使用data.frames。

标签: r


【解决方案1】:

OP 没有在输出中提到他们想要什么形式,但我正在用可能的解决方案完全更新这个答案。

首先,一些可重现的样本数据可以使用(实际上可以使用t.test)。

set.seed(1)
mymat <- matrix(sample(100, 40, replace = TRUE), 
                ncol = 8, dimnames = list(
                  paste("gene", 1:5, sep = ""), 
                  c("A", "A", "A", "B", "B", "B", "C", "C")))
mymat
#        A  A  A   B  B  B  C  C
# gene1 27 90 21  50 94 39 49 67
# gene2 38 95 18  72 22  2 60 80
# gene3 58 67 69 100 66 39 50 11
# gene4 91 63 39  39 13 87 19 73
# gene5 21  7 77  78 27 35 83 42

我把所有的辛苦工作都交给了combn 函数。在combn 函数中,我利用FUN 参数添加了一个函数,该函数按每行创建t.test“统计”向量(我假设每行一个基因)。我还在结果向量中添加了attribute,以提醒我们在计算统计数据时使用了哪些列。

temp <- combn(unique(colnames(mymat)), 2, FUN = function(x) {
  out <- vector(length = nrow(mymat))
  for (i in sequence(nrow(mymat))) {
    out[i] <- t.test(mymat[i, colnames(mymat) %in% x[1]], 
           mymat[i, colnames(mymat) %in% x[2]])$statistic
  }
  attr(out, "NAME") <- paste(x, collapse = "")
  out
}, simplify = FALSE)

上面的输出是vectorslist。将其转换为matrix 可能更方便。由于我们知道向量中的每个值代表一行,并且每个向量总体上代表一个列值组合(AB、AC 或 BC),因此我们可以将其用于生成的 dimnamesmatrix

DimNames <- list(rownames(mymat), sapply(temp, attr, "NAME"))

final <- do.call(cbind, temp)
dimnames(final) <- DimNames
final
#               AB         AC           BC
# gene1 -0.5407966 -0.5035088  0.157386919
# gene2  0.5900350 -0.7822292 -1.645448267
# gene3 -0.2040539  1.7263502  1.438525163
# gene4  0.6825062  0.5933218  0.009627409
# gene5 -0.4384258 -0.9283003 -0.611226402

一些人工验证:

## Should be the same as final[1, "AC"]
t.test(mymat[1, colnames(mymat) %in% "A"],
       mymat[1, colnames(mymat) %in% "C"])$statistic
#          t 
# -0.5035088 

## Should be the same as final[5, "BC"]    
t.test(mymat[5, colnames(mymat) %in% "B"],
       mymat[5, colnames(mymat) %in% "C"])$statistic
#          t 
# -0.6112264 

## Should be the same as final[3, "AB"]
t.test(mymat[3, colnames(mymat) %in% "A"],
       mymat[3, colnames(mymat) %in% "B"])$statistic
#          t 
# -0.2040539 

更新

基于@EDi 的回答,这是另一种方法。它利用“reshape2”中的melt 将数据转换为“长”格式。从那里,和以前一样,得到你想要的东西是非常简单的子集工作。那里的输出相对于纯combn 方法所采用的方法进行了转置,但值是相同的。

library(reshape2)
mymatL <- melt(mymat)

byGene <- split(mymatL, mymatL$Var1)
RowNames <- combn(unique(as.character(mymatL$Var2)), 2, 
                  FUN = paste, collapse = "")

out <- sapply(byGene, function(combos) {
  combn(unique(as.character(mymatL$Var2)), 2, FUN = function(x) {
    t.test(value ~ Var2, combos[combos[, "Var2"] %in% x, ])$statistic
  }, simplify = TRUE)
})

rownames(out) <- RowNames
out
#         gene1      gene2      gene3       gene4      gene5
# AB -0.5407966  0.5900350 -0.2040539 0.682506188 -0.4384258
# AC -0.5035088 -0.7822292  1.7263502 0.593321770 -0.9283003
# BC  0.1573869 -1.6454483  1.4385252 0.009627409 -0.6112264

第一个选项要快得多,至少在这个较小的数据集上:

microbenchmark(fun1(), fun2())
# Unit: milliseconds
#    expr       min        lq    median       uq      max neval
#  fun1()  8.812391  9.012188  9.116896  9.20795 17.55585   100
#  fun2() 42.754296 43.388652 44.263760 45.47216 67.10531   100

【讨论】:

  • 你的代码没有计算出我到底想要什么。例如,对于我示例中的 matix,我想为不同组的gene1 计算 T 检验,这意味着,计算gene1 的 T 分数:T-score-gene1:A
  • @user2806363,抱歉,但在您实际发布带有可重复样本数据的格式良好的问题您的预期输出样本(作为问题的一部分,而不是作为cmets 中不可读的代码),您可能不会得到任何有意义的帮助。
  • @user2806363,我决定继续尝试我认为您可能正在寻找的东西。然而,在未来,最好提前明确,这样您就不必重复发布问题来试图获得可接受的答案。此外,如果您同时展示您所摆弄的东西,它会有所帮助 - 在较早的答案中分享了一些好的想法,这些想法至少可以让您接近您可能(1)想要解决问题或(2 ) 你应该如何更清楚地向他人展示问题。
  • @user2806363,现在这实际上让那些提供免费帮助的人感到恼火。在单个示例中查看 t.test 的输出结构。看看我从哪里获取 statistic 值,看看你是否可以修改我已经分享的代码,以提出你自己的答案,关于如何包含每个 T 分数的 P 值。谢谢。
猜你喜欢
  • 2023-04-07
  • 2019-10-15
  • 2021-05-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多