4

我有一个数据框,它的开头如下:

                                SM_H1455          SM_V1456          SM_K1457      SM_X1461          SM_K1462
ENSG00000000419.8                290               270               314               364               240
ENSG00000000457.8                252               230               242               220               106
ENSG00000000460.11               154               158               162               136                64
ENSG00000000938.7              20106             18664             19764             15640             19024
ENSG00000000971.11                30                10                 4                 2                10

请注意,还有更多的列和行。

这就是我想要做的:我想更改列的名称。列名中最重要的信息,例如 SM_H1455,是字符串的第 4 个字符。在这种情况下,它是一个 H。如果第 4 个字符是“H”或“K”,我想要做的是将“SM”部分更改为“Control”,如果第 4 列是“X”,则将“Case”或“V”。我想保留其他所有内容。所以最后,我想要一张这样的桌子:

                        Control_H1455          Case_V1456        Control_K1457      Case_X1461        Control_K1462
ENSG00000000419.8                290               270               314               364               240
ENSG00000000457.8                252               230               242               220               106
ENSG00000000460.11               154               158               162               136                64
ENSG00000000938.7              20106             18664             19764             15640             19024
ENSG00000000971.11                30                10                 4                 2                10

请记住,第 4 个字符是“V”、“X”、“K”还是“H”是完全随机的。

我会很感激任何帮助!谢谢。

4

2 回答 2

4

单线替代方案:

names(x) <- sub("^..(.(H|K))", "Control\\1", sub("^..(.(X|V))", "Case\\1", names(x))

首先更改包含 X 和 V 的名称,然后在输出字符串中更改包含名称的 H 和 K。

于 2013-07-31T12:42:27.033 回答
4

一种方法,x你的df在哪里:

controls <- which(substring(names(x),4,4) %in% c("H","K"))
cases <- which(substring(names(x),4,4) %in% c("X","V"))
names(x)[controls] <- gsub("SM","Control",names(x)[controls])
names(x)[cases] <- gsub("SM","Case",names(x)[cases])

或者:

names(x) <- sapply(names(x),function(z) {
    if(substring(z,4,4) %in% c("H","K"))
        sub("SM","Control",z)
    else if(substring(z,4,4) %in% c("X","V"))
        sub("SM","Case",z)
})
于 2013-07-31T12:33:39.847 回答