如何根据规定更改数据框中的列名

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,是字符串的第四个字符。在这种情况下,它是一个 H。我想做的是,如果第四个字符是“H”或“K”,则将“SM”部分更改为“Control”,如果第四列是“X”或“V”,则更改为“Case”。我想保留名称中的所有其他内容。因此,最终我想得到这样的表:
                        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

请记住,第四个字符是 "V"、"X"、"K" 或 "H" 完全是随机的。
我会非常感激任何帮助!谢谢。
2个回答

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)
})

4

一行代码的替代方案:

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

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


而且这种解决方案将比使用“substring”函数快得多。 - DrDom

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接