2013-07-31 68 views
2

我有一個數據幀的數據幀的列名,它的開始是下面:R:如何更改基於規範

       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和rows。

這是我想要做的:我想改變列的名稱。列名中最重要的信息,例如SM_H1455,是字符串的第4個字符。在這種情況下,它是H.我想要做的是如果第四個字符是「H」或「K」,則將「SM」部分更改爲「控制」;如果第四列是「X」,則將「SM」 「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

一種方法,其中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) 
}) 
+0

非常感謝! :-) – zfz

2

單行替代:

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

首先含有X和V的名稱被改變,然後在輸出字符串H和K中包含名稱被改變。

+0

噢,真好!謝謝! – zfz

+0

這個解決方案比使用'substring'函數要快得多。 – DrDom