修改和拆分 R 数据框中的行名称
Modifying and splitting row names in an R data frame
我得到以下 table 一些基因的表达数据:
> 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
我想做的是清理这个 table,这样基因名称就可以像我用于其他目的的以下代码一样拆分:
> 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),则应将其删除,并且应为所有基因 'copies' 分配一个平均表达水平(此处,'copies' 和 PITG_00005 应分配 exp = (0.16442671 + 0.94545358)/2),
之前合并的所有基因都应分配相同的表达水平(即,所有“PITG_23067”、“PITG_23068”、“PITG_16110”)的表达水平为 34.11854242。
如有任何建议,我将不胜感激!
试试这个:
# 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)))
然后合并,当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
您可以在 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
向量可以aggregate
d使用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"))
我得到以下 table 一些基因的表达数据:
> 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
我想做的是清理这个 table,这样基因名称就可以像我用于其他目的的以下代码一样拆分:
> 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),则应将其删除,并且应为所有基因 'copies' 分配一个平均表达水平(此处,'copies' 和 PITG_00005 应分配 exp = (0.16442671 + 0.94545358)/2),
之前合并的所有基因都应分配相同的表达水平(即,所有“PITG_23067”、“PITG_23068”、“PITG_16110”)的表达水平为 34.11854242。
如有任何建议,我将不胜感激!
试试这个:
# 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)))
然后合并,当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
您可以在 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
向量可以aggregate
d使用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"))