2016-11-23 183 views
0

我想列名的後綴移動到它的開始,使之成爲其前綴。我有很多列更改名稱(除了後綴),所以手動重命名不是一個選項。變換後綴爲前綴的列名

實施例:

set.seed(1) 
dat <- data.frame(ID = 1:5, 
        speed.x.alpha =  runif(5), 
        power.x.alpha = rpois(5, 1), 
        force.x.alpha = rexp(5), 
        speed.y.beta = runif(5), 
        power.y.beta = rpois(5, 1), 
        force.y.beta = rexp(5)) 

在端結束該數據幀應具有以下的列名:

ID,alpha.speed.x,alpha.power.x,alpha.force.x, beta.speed.x,beta.power.x,force.power.x。

我極力想我需要一個GSUB /子表達,讓我最後一個點,我會再粘貼到colnames,並最終從末尾移除後選擇的字符。到目前爲止,都沒有成功,但...

回答

3

一對夫婦的gsub S和paste0將這樣的伎倆:

gsub("y$", "x", gsub("(^.*)\\.(.*a$)", paste0("\\2", ".", "\\1"), names(dat))) 
[1] "ID"   "alpha.speed.x" "alpha.power.x" "alpha.force.x" "beta.speed.x" 
[6] "beta.power.x" "beta.force.x" 

在正則表達式的()捕捉匹配子表達式的字符。 「\」。用於匹配文字「。」。和「$」將表達式錨定到字符串的末尾。第二個參數將捕獲的子表達式粘貼在一起。這個結果被輸入到第二個gsub,如果找到一個,則用「x」代替結尾「y」。

重命名變量,使用

names(dat) <- gsub("y$", "x", gsub("(^.*)\\.(.*a$)", paste0("\\2", ".", "\\1"), names(dat))) 
2

這裏是sub一個選項。我們匹配一個或多個不是從字符串的開頭(^)開始的.[^.]+)的字符,將它作爲組((...) - 在大括號內)捕獲,然後是點(\\. - 請注意.是元字符表示任何字符,所以需要轉義(\\)將其作爲文字字符讀入或放在方括號中),然後是另一組不是點的字符(在第二個捕獲組內),然後是另一個點和字符的其餘部分直到字符串的末尾。在替換中,我們更改捕獲組的反向引用的順序以獲得預期的輸出。

names(dat) <- sub("^([^.]+)\\.([^.]+)\\.(.*)", "\\3.\\1.\\2", names(dat)) 
names(dat) 
#[1] "ID"   "alpha.speed.x" "alpha.power.x" "alpha.force.x" 
#[5] "beta.speed.y" "beta.power.y" "beta.force.y"