【问题标题】:Modifying and splitting row names in an R data frame修改和拆分 R 数据框中的行名
【发布时间】:2020-07-25 05:23:32
【问题描述】:

我有下表包含一些基因的表达数据:

> exp_table
                                                exp
PITG_00005b                              0.16442671
PITG_00005a                              0.94545358
PITG_00004                               0.86324023
PITG_00003                               0.04110668
PITG_00002                               1.10988029
MERGED:PITG_23067_PITG_23068_PITG_16110 34.11854242
MERGED:PITG_23017_PITG_23018             0.00000000

我想要做的是清理这个表,以便基因名称被拆分,就像我用于其他目的的以下代码一样:

> exp_names <- gsub("[a-e]", "", rownames(exp_table))
> exp_names <- gsub("MERGED:", "", exp_names)
> exp_names <- strtrim(unlist(strsplit(exp_names, "(?<=[0-9]_)", perl=TRUE)), 10)
> exp_names
 [1] "PITG_00005" "PITG_00005" "PITG_00004" "PITG_00003" "PITG_00002" "PITG_23067"
 [7] "PITG_23068" "PITG_16110" "PITG_23017" "PITG_23018"

即,在我需要的数据框中: 如果基因(a 或 b)末尾有一个额外的字母,则应将其删除,并且应为所有基因“副本”分配平均表达水平(此处,应分配 PITG_00005 的两个“副本” exp = (0.16442671 + 0.94545358)/2),
先前合并的所有基因都应分配相同的表达水平(即,所有“PITG_23067”、“PITG_23068”、“PITG_16110”的表达水平为 34.11854242)。

如果有任何建议,我将不胜感激!

【问题讨论】:

  • PITG_00005b 和 PITG_00005a 会发生什么变化,它们获得了什么价值? 0.16442671 还是 0.94545358?
  • 没错,我忘了...刚刚编辑了我的问题,谢谢!

标签: r bioinformatics


【解决方案1】:

您可以在lapply 中进行字符串操作。这为您提供了一个列表格式,可以利用 length 信息对 repeat 值进行利用。

rn <- rownames(exp_table)
rn <- gsub("MERGED:", "", rn, fixed=T)
rn <- unlist(lapply(rn, strsplit, "(?<=[0-9]_)", perl=TRUE), recursive=F)
rn <- lapply(rn, strtrim, 10)
(tmp <- unlist(mapply(function(x, y) 
  setNames(rep(exp_table[x, 1], length(y)), y), 1:nrow(exp_table), rn)))
# PITG_00005  PITG_00005  PITG_00004  PITG_00003  PITG_00002 
# 0.16442671  0.94545358  0.86324023  0.04110668  1.10988029 
#  PITG_23067  PITG_23068  PITG_16110  PITG_23017  PITG_23018 
# 34.11854242 34.11854242 34.11854242  0.00000000  0.00000000 

向量可以是aggregated,使用mean得到最终结果。

a <- aggregate(tmp ~ nm, data.frame(res, nm=names(tmp)), mean)
res <- `rownames<-`(a[, 2, F], a$nm)
res
#                    res
# PITG_00002  1.10988029
# PITG_00003  0.04110668
# PITG_00004  0.86324023
# PITG_00005  0.55494014
# PITG_16110 34.11854242
# PITG_23017  0.00000000
# PITG_23018  0.00000000
# PITG_23067 34.11854242
# PITG_23068 34.11854242

数据:

exp_table <- structure(list(exp = c(0.16442671, 0.94545358, 0.86324023, 0.04110668, 
1.10988029, 34.11854242, 0)), class = "data.frame", row.names = c("PITG_00005b", 
"PITG_00005a", "PITG_00004", "PITG_00003", "PITG_00002", "MERGED:PITG_23067_PITG_23068_PITG_16110", 
"MERGED:PITG_23017_PITG_23018"))

【讨论】:

    【解决方案2】:

    试试这个:

    # example data
    exp_table <- read.table(text = " exp
    PITG_00005b                              0.16442671
    PITG_00005a                              0.94545358
    PITG_00004                               0.86324023
    PITG_00003                               0.04110668
    PITG_00002                               1.10988029
    MERGED:PITG_23067_PITG_23068_PITG_16110 34.11854242
    MERGED:PITG_23017_PITG_23018             0.00000000")
    

    扩展您的 regex 步骤以获取 ID,我正在创建一个查找 dataframe

    exp_names <- gsub("[a-e]", "", rownames(exp_table))
    exp_names <- gsub("MERGED:", "", exp_names)
    exp_names <- stack(
      setNames(
        lapply(strsplit(exp_names, "(?<=[0-9]_)", perl = TRUE), strtrim, width = 10),
        rownames(exp_table)))
    

    然后merge,当is ID不唯一时得到mean

    res <- merge(exp_names, exp_table, by.x = "ind", by.y = 0)
    aggregate(exp ~ values, res, mean)
    #       values         exp
    # 1 PITG_00002  1.10988029
    # 2 PITG_00003  0.04110668
    # 3 PITG_00004  0.86324023
    # 4 PITG_00005  0.55494014
    # 5 PITG_16110 34.11854242
    # 6 PITG_23017  0.00000000
    # 7 PITG_23018  0.00000000
    # 8 PITG_23067 34.11854242
    # 9 PITG_23068 34.11854242
    

    【讨论】:

      猜你喜欢
      • 2017-06-03
      • 2020-04-19
      • 1970-01-01
      • 2018-05-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-09-22
      相关资源
      最近更新 更多