【问题标题】:Finding the duplicates, average them and create a proper table找到重复项,平均它们并创建一个合适的表
【发布时间】:2014-05-13 12:43:54
【问题描述】:

让我们从我的数据开始:

> dput(head(tbl_end))
structure(list(`Gene name` = c("at1g01050.1", "at1g01080.1", 
"at1g01090.1", "at1g01220.1", "at1g01320.2", "at1g01420.1"), 
    `1_1` = c(0, 0, 0, 0, 0, 0), `1_2` = c(0, 0, 0, 0, 0, 0), 
    `1_3` = c(0, 1, 0, 0, 0, 0), `1_4` = c(0, 0.660693687777888, 
    0, 0, 0, 0), `1_5` = c(0, 0.521435654491704, 0, 0, 0, 1), 
    `1_6` = c(0, 0.437291194705566, 0, 0, 0, 1), `1_7` = c(0, 
    0.52204783488213, 0, 0, 0, 0), `1_8` = c(0, 0.524298383907171, 
    0, 0, 0, 0), `1_9` = c(1, 0.376865096972469, 0, 1, 0, 0), 
    `1_10` = c(0, 0, 0, 0, 0, 0), `1_11` = c(0, 0, 0, 0, 0, 0
    ), `1_12` = c(0, 0, 0, 0, 0, 0), `1_13` = c(0, 0, 0, 0, 0, 
    0), `1_14` = c(0, 0, 0, 0, 0, 0), `1_15` = c(0, 0, 0, 0, 
    0, 0), `1_16` = c(0, 0, 0, 0, 0, 0), `1_17` = c(0, 0, 0, 
    0, 0, 0), `1_18` = c(0, 0, 0.476101907006443, 0, 0, 0), `1_19` = c(0, 
    0, 1, 0, 0, 0), `1_20` = c(0, 0, 0, 0, 0, 0), `1_21` = c(0, 
    0, 0, 0, 1, 0), `1_22` = c(0, 0, 0, 0, 0, 0), `1_23` = c(0, 
    0, 0, 0, 0, 0), `1_24` = c(0, 0, 0, 0, 0, 0)), .Names = c("Gene name", 
"1_1", "1_2", "1_3", "1_4", "1_5", "1_6", "1_7", "1_8", "1_9", 
"1_10", "1_11", "1_12", "1_13", "1_14", "1_15", "1_16", "1_17", 
"1_18", "1_19", "1_20", "1_21", "1_22", "1_23", "1_24"), row.names = c(NA, 
6L), class = "data.frame")

所以我有超过 2k 行。作为行的名称,我设置了基因名称,但是有一个问题。有时同一个基因有不同的“模型”(所以他们把点放在名称和数字 1 或 2 之后)但它仍然是同一个基因,所以我想找到所有这些重复项(相同的基因名称)并平均不同的值这个基因的列,只留下 1 行的平均值。

可以吗?

仅显示我拥有的一些基因名称:

> dput(vec_names)
c("at1g01050.1", "at1g01080.1", "at1g01090.1", "at1g01220.1", 
"at1g01320.2", "at1g01420.1", "at1g01470.1", "at1g01800.1", "at1g01910.5", 
"at1g01920.2", "at1g01960.1", "at1g01980.1", "at1g02020.2", "at1g02100.2", 
"at1g02130.1", "at1g02140.1", "at1g02150.1", "at1g02305.1", "at1g02500.2", 
"at1g02560.1", "at1g02780.1", "at1g02880.3", "at1g02920.1", "at1g02930.2", 
"at1g03030.1", "at1g03090.2", "at1g03110.1", "at1g03130.1", "at1g03210.1", 
"at1g03220.1", "at1g03230.1", "at1g03310.2", "at1g03330.1", "at1g03475.1", 
"at1g03630.2", "at1g03680.1", "at1g03870.1", "at1g03900.1", "at1g04080.2", 
"at1g04130.1", "at1g04170.1", "at1g04190.1", "at1g04270.2", "at1g04350.1", 
"at1g04410.1", "at1g04420.1", "at1g04530.1", "at1g04640.2", "at1g04690.1", 
"at1g04750.2", "at1g04810.1", "at1g04850.1", "at1g04870.2", "at1g05010.1", 
"at1g05180.1", "at1g05190.1", "at1g05320.3", "at1g05350.1", "at1g05520.1", 
"at1g05560.1", "at1g05620.2", "at1g06000.1", "at1g06110.1", "at1g06130.2", 
"at1g06290.1", "at1g06410.1", "at1g06550.1", "at1g06560.1", "at1g06570.1", 

我认为有一个功能,但找不到它。

【问题讨论】:

  • 看看gsub,或str_extract 来自stringr 包,还有aggregate ...
  • 这绝对是我正在寻找的东西,但您知道如何将重复项标记为我正在寻找的模式吗?以一种有效的方式,因为我知道如何一一找到并替换它们。

标签: r


【解决方案1】:

使用data.table

library(data.table)
dt <- data.table(dat)
dt[, gene_unique := gsub("[.]*", "", dt$Gene)]
cols <- colnames(dt)[2:25]
dt[, lapply(.SD, mean), by = gene_unique, .SDcols = cols]

按照 cmets 中的建议使用 aggregate

dat$`Gene name` = gsub("[.]*", "", dat$Gene)
aggregate(. ~ `Gene name`, dat, mean)

【讨论】:

  • 看起来不错,但是在使用该函数后,我看到的行数与以前的数据相同,我想应该取重复项的平均值并将其存储在 1 行中,其余的应该删除。
  • 您是用于所有数据还是仅用于示例?示例中没有重复项。在dt = rbind(dt[1], dt) 上面的第 2 行之后添加以下代码行,您应该会看到它会将行数从 7 减少到 6。
  • 我将它用于我的数据。那应该可以工作,因此这可能意味着我的数据中没有重复项……这不应该是事实。任何快速的想法如何检查我的数据中是否有任何重复?
  • 执行length(unique(gsub("[.]*", "", vec_names)))length(vec_names) 之类的操作并比较两者。我在您提供的 vec_names 中没有看到任何重复项,即使编号(.2、.5 等)表明存在重复项。
  • &gt; length(unique(gsub("[.]*", "", vec_names))) [1] 2744 &gt; length(vec_names) [1] 2744 所以这是个愚蠢的问题。现在我必须弄清楚为什么没有重复。感谢那。我一定会使用该功能!
猜你喜欢
  • 1970-01-01
  • 2021-06-16
  • 2014-05-25
  • 2021-01-26
  • 2014-03-07
  • 2020-02-13
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多