[英]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.