2012-05-19 55 views
2

我正在重命名數據框架中的大部分變量,而且我對我的方法沒有留下深刻的印象。R:重命名數據框中變量的子集

因此,有沒有人有一個更聰明或更快的方式,然後提出下面只使用基地?

data(mtcars) 
    # head(mtcars) 


    temp.mtcars <- mtcars 
    names(temp.mtcars) <- c((x <- c("mpg", "cyl", "disp")), 
          gsub('^', "baR.", setdiff(names (mtcars),x))) 
    str(temp.mtcars) 
    'data.frame': 32 obs. of 11 variables: 
    $ mpg  : num 21 21 22.8 21.4 18.7 18.1 14.3 24.4 22.8 19.2 ... 
    $ cyl  : num 6 6 4 6 8 6 8 4 4 6 ... 
    $ disp : num 160 160 108 258 360 ... 
    $ baR.hp : num 110 110 93 110 175 105 245 62 95 123 ... 
    $ baR.drat: num 3.9 3.9 3.85 3.08 3.15 2.76 3.21 3.69 3.92 3.92 ... 
    $ baR.wt : num 2.62 2.88 2.32 3.21 3.44 ... 
    $ baR.qsec: num 16.5 17 18.6 19.4 17 ... 
    $ baR.vs : num 0 0 1 1 0 1 0 1 1 1 ... 
    $ baR.am : num 1 1 1 0 0 0 0 0 0 0 ... 
    $ baR.gear: num 4 4 4 3 3 3 3 4 4 4 ... 
    $ baR.carb: num 4 4 1 1 2 1 4 2 2 4 ... 
+2

這是一個問題,我試圖回答一個非常簡單的答案,只使用'paste'和子集,除非我確定有一個原因使得它變得複雜只是沒有充分解釋。 – joran

+1

@joran我懷疑原因是子集假定你的原始矢量名稱是按照你的對象名稱的正確順序。 – Andrie

+0

@joran,請做。我會非常感謝更簡單的解決方案。這就是我發佈這個問題的原因。 –

回答

3

我會用ifelse

names(temp.mtcars) <- ifelse(names(mtcars) %in% c("mpg", "cyl", "disp"), 
          names(mtcars), 
          paste("bar", names(mtcars), sep = ".")) 
+0

我喜歡這個解決方案,因爲它不會創建任何新的對象。而且,它可以很容易地變成一個功能。謝謝。 –

+0

請注意 - 這裏假定您的新名稱的順序與現有名稱相同。 – Andrie

+1

@Andrie,我不知道我明白了什麼問題。我所尋找的是一種_renaming_所有變量的方法,除了一個子集;我不明白訂單如何成爲一個問題。如果你解釋問題,我將不勝感激。謝謝。 –

7

使用基礎R僅

plyr擁有便捷的功能rename()已經做了你問什麼包編輯的答案。您修改的問題僅指定使用基準R.這樣做的一個簡單方法是簡單地複製plyr::rename中的代碼並創建您自己的功能。

rename <- function (x, replace) { 
    old_names <- names(x) 
    new_names <- unname(replace)[match(old_names, names(replace))] 
    setNames(x, ifelse(is.na(new_names), old_names, new_names)) 
} 

功能rename接受一個參數,它是名爲向量,其中該向量的元素是新的名稱,並且該矢量的名稱是現有名稱。有很多方法可以構建這樣一個命名向量。在下面的示例中,我只需使用structure

x <- c("mpg", "disp", "wt") 
some.names <- structure(paste0("baR.", x), names=x) 
some.names 
     mpg  disp   wt 
"baR.mpg" "baR.disp" "baR.wt" 

現在,您可以重命名:

mtcars <- rename(mtcars, replace=some.names) 

結果:

'data.frame': 32 obs. of 11 variables: 
$ baR.mpg : num 21 21 22.8 21.4 18.7 18.1 14.3 24.4 22.8 19.2 ... 
$ cyl  : num 6 6 4 6 8 6 8 4 4 6 ... 
$ baR.disp: num 160 160 108 258 360 ... 
$ hp  : num 110 110 93 110 175 105 245 62 95 123 ... 
$ drat : num 3.9 3.9 3.85 3.08 3.15 2.76 3.21 3.69 3.92 3.92 ... 
$ baR.wt : num 2.62 2.88 2.32 3.21 3.44 ... 
$ qsec : num 16.5 17 18.6 19.4 17 ... 
$ vs  : num 0 0 1 1 0 1 0 1 1 1 ... 
$ am  : num 1 1 1 0 0 0 0 0 0 0 ... 
$ gear : num 4 4 4 3 3 3 3 4 4 4 ... 
$ carb : num 4 4 1 1 2 1 4 2 2 4 ... 
+0

感謝您回覆我的問題。問題是你的解決方案增加了一個後綴,而不是前綴。此外,我正在尋找解決方案_using base only_。 –

+0

@EricFail編輯過的答案。 – Andrie

+0

謝謝,唯一的問題是您的最新功能重命名選定的變量,而不是其餘的變量。此外,它重新排序數據,但謝謝。我很感激你花了時間。 –

2

幾乎相同,但沒有plyr

data(mtcars) 

temp.mtcars <- mtcars 

carNames <- names(temp.mtcars) 
modifyNames <- !(carNames %in% c("mpg", "cyl", "disp")) 

names(temp.mtcars)[modifyNames] <- paste("baR.", carNames[modifyNames], sep="") 

輸出:

str(temp.mtcars) 
'data.frame': 32 obs. of 11 variables: 
$ mpg  : num 21 21 22.8 21.4 18.7 18.1 14.3 24.4 22.8 19.2 ... 
$ cyl  : num 6 6 4 6 8 6 8 4 4 6 ... 
$ disp : num 160 160 108 258 360 ... 
$ baR.hp : num 110 110 93 110 175 105 245 62 95 123 ... 
$ baR.drat: num 3.9 3.9 3.85 3.08 3.15 2.76 3.21 3.69 3.92 3.92 ... 
$ baR.wt : num 2.62 2.88 2.32 3.21 3.44 ... 
$ baR.qsec: num 16.5 17 18.6 19.4 17 ... 
$ baR.vs : num 0 0 1 1 0 1 0 1 1 1 ... 
$ baR.am : num 1 1 1 0 0 0 0 0 0 0 ... 
$ baR.gear: num 4 4 4 3 3 3 3 4 4 4 ... 
$ baR.carb: num 4 4 1 1 2 1 4 2 2 4 ... 
+1

保重。此解決方案假定您的名稱與您要重命名的對象的順序相同。 – Andrie

+0

謝謝你回答我的問題。 –

1

你可以在gdata包使用rename.vars功能。 當您只想替換變量名稱的子集,並且名稱向量的順序與data.frame中的名稱順序不同時,它可以很好地工作。

從幫助文件改編:

library(gdata) 
data <- data.frame(x=1:10,y=1:10,z=1:10) 
names(data) 
data <- rename.vars(data, from=c("z","y"), to=c("Z","Y")) 
names(data) 

data.frame名稱轉換:

[1] "x" "y" "z" 

[1] "x" "Y" "Z" 

即,注意這是如何處理的子集,事實上,名稱字符串的順序與data.frame中的名稱不同。

0
names(df)[match(
       c('old_var1','old_var2'), 
       names(df) 
       )]=c('new_var1', 'new_var2')