我有一个数据框,它的起点如下:
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”是完全随机的。
我很感激任何帮助!感谢。
答案 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.