重命名行名

Rename rownames

我想通过删除行名的公共部分来重命名行名

          a b  c
CDA_Part  1 4  4
CDZ_Part  3 4  4
CDX_Part  1 4  4

结果

     a b  c
CDA  1 4  4
CDZ  3 4  4
CDX  1 4  4

1.Create一个minimal reproducible example:

df <- data.frame(a = 1:3, b = 4:6)
rownames(df) <- c("CDA_Part", "CDZ_Part", "CDX_Part")

df

Returns:

         a b
CDA_Part 1 4
CDZ_Part 2 5
CDX_Part 3 6

2.Suggested 使用基数 Rs 的解决方案 gsub:

rownames(df) <- gsub("_Part", "", rownames(df), fixed=TRUE)

df

Returns:

    a b
CDA 1 4
CDZ 2 5
CDX 3 6

解释:

gsub 使用 regex 来识别和替换部分字符串。前三个参数是:

  • pattern 要替换的模式 - 即“_Part”
  • replacement 用作替换的字符串 - 即空字符串 ""
  • x 我们要替换的字符串 - 即行名

附加参数(不在前 3 个中):

  • fixed 指示 pattern 是正则表达式还是 "just" 普通字符串 - 即只是一个字符串

你可以试试这个方法,你可以使用 Reduce with intersect 来确定名称中的公共部分,注意我在这里假设你的数据集中有如下结构,其中下划线是两个单词之间的分隔符。此解决方案适用于 word_commonpartcommonpart_word,如下例所示。

逻辑: 使用 strsplit,拆分列基础下划线(不吃下划线,所以使用环视零宽度断言),现在使用 Reduce 查找所有行名的字符串之间的交集。然后将找到的那些粘贴为带有管道分隔项的正则表达式,并使用 gsub 替换为 Nothing。

输入:

structure(list(a = 1:4, b = 4:7), class = "data.frame", row.names = c("CDA_Part", 
"CDZ_Part", "CDX_Part", "Part_ABC"))

解法:

red <- Reduce('intersect', strsplit(rownames(df),"(?=_)",perl=T)) 
##1. determining the common parts
e <- expand.grid(red, red) 
##2. getting all the combinations of underscores and the remaining parts
rownames(df) <- gsub(paste0(do.call('paste0', e[e$Var1!=e$Var2,]), collapse = "|"), '', rownames(df)) 
##3. filtering only those combinations which are different and pasting together using do.call
##4. using paste0 to get regex seperated by pipe
##5.replacing the common parts with nothing here

输出:

> df
#        a b
#    CDA 1 4
#    CDZ 2 5
#    CDX 3 6
#    ABC 4 7