2015-12-14 85 views
5

在某些情況下,要重命名的列不存在時,是否有聰明的方法來使用dplyr中的重命名函數?在dplyr和column中使用重命名時避免錯誤

例如,我想下面的不導致錯誤

mtcars%>%rename(miles_per_gallon=mpg,missing_varible=foo) 

(在這個結果:錯誤:未知的變量:FOO)

而是與所有可能的重命名數據框完成。

目前我明確地檢查重命名

感謝

伊恩

+2

爲什麼要重命名不存在的列? – DatamineR

+2

並非所有與我一起工作的對象(行)都存在屬性(列)。這意味着如果我以特定的方式對數據進行子集分類,我最終可能會得到比我預期的列數少的數據幀 - 因此需要進行明確的檢查 – Iain

回答

5

有時它的好於dplyr沒有盡全力前特定的列存在。這可能是其中的一次。我會成立,作爲一個鍵進行操作的向量:

namekey <- c(mpg="miles_per_gallon", cyl="cylinders", disp="displacement", hp="horse_power", 
      drat="rear_axle_ratio", wt="weight", qsec="quarter_mile_time", vs="v_s", 
      am="transmission", gear="number_of_gears", carb="number_of_carburetors", 
      foo="missing_variable") 

mtcars1 <- mtcars[,1:2] 
mtcars1$foo <- rnorm(nrow(mtcars1)) 

names(mtcars1) <- namekey[names(mtcars1)] 

head(mtcars1) 
#     miles_per_gallon cylinders missing_variable 
# Mazda RX4      21.0   6  -0.9901081 
# Mazda RX4 Wag     21.0   6  0.2338014 
# Datsun 710     22.8   4  -0.3077473 
# Hornet 4 Drive    21.4   6  1.1200518 
# Hornet Sportabout    18.7   8  0.7482842 
# Valiant      18.1   6  0.4206614 

一旦你有你的鑰匙,它只是一個單一的,易於理解的代碼,不會重命名線。

+0

這可能是好的,但仍然可以嘗試將所有內容保存在一個單獨的列表中範式:) –

+0

@ Maxim.K'dplyr'是一個包含base R的範例。這是一個基本的R解決方案,因此在這個意義上它仍然是一個範例。這只是不依賴任何'dplyr'帶給遊戲的附加解決方案。 –

2

plyr包具有rename()函數與warn_missing參數。

plyr::rename(
    mtcars, 
    replace  = c(mpg="miles_per_gallon", foo="missing_varible"), 
    warn_missing = FALSE 
) 

如果你使用它,請考慮使用requireNamespace()instead oflibrary(),所以它的功能名稱不與dplyr的碰撞。