繁体   English   中英

修改和拆分 R 数据帧中的行名

[英]Modifying and splitting row names in an R data frame

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

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

我将不胜感激任何建议!

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

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 

可以使用mean对向量进行aggregate d 以获得最终结果。

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

尝试这个:

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

扩展您的正则表达式步骤以获取 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)))

然后在 is ID 不唯一时合并并获取均值

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM