R:如何根据规范更改数据框中的列名称

时间:2013-07-31 12:21:56

标签: string r dataframe multiple-columns bioinformatics

我有一个数据框,它的起点如下:

                                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

请注意,还有更多cols和row。

这是我想要做的:我想更改列的名称。列名称中最重要的信息,例如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”是完全随机的。

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

2 个答案:

答案 0 :(得分:2)

一种方式,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)
})

答案 1 :(得分:2)

单线替代方案:

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

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