[英]Switched columns with dplyr rename_if
嘗試使用 dplyr rename_if
和新舊模式列表重命名一些數據框列,一些列名最終在 output 中切換。
head(mtcars)
mpg cyl disp hp drat wt qsec vs am gear carb
Mazda RX4 21.0 6 160 110 3.90 2.620 16.46 0 1 4 4
Mazda RX4 Wag 21.0 6 160 110 3.90 2.875 17.02 0 1 4 4
Datsun 710 22.8 4 108 93 3.85 2.320 18.61 1 1 4 1
Hornet 4 Drive 21.4 6 258 110 3.08 3.215 19.44 1 0 3 1
Hornet Sportabout 18.7 8 360 175 3.15 3.440 17.02 0 0 3 2
Valiant 18.1 6 225 105 2.76 3.460 20.22 1 0 3 1
lst <- list(Old=c("mpg", "cyl", "disp", "carb", "wt", "gear"), New=c("Miles per Gallon", "Cylinder", "Displacement", "Carburator", "Weight", "Gear"))
mtcars %>%
rename_if(names(.) %in% lst$Old,
function(x){
lst$New[which(lst$Old %in% x)]}) %>%
head()
Miles per Gallon Cylinder Displacement hp drat Carburator
Mazda RX4 21.0 6 160 110 3.90 2.620
Mazda RX4 Wag 21.0 6 160 110 3.90 2.875
Datsun 710 22.8 4 108 93 3.85 2.320
Hornet 4 Drive 21.4 6 258 110 3.08 3.215
Hornet Sportabout 18.7 8 360 175 3.15 3.440
Valiant 18.1 6 225 105 2.76 3.460
qsec vs am Weight Gear
Mazda RX4 16.46 0 1 4 4
Mazda RX4 Wag 17.02 0 1 4 4
Datsun 710 18.61 1 1 4 1
Hornet 4 Drive 19.44 1 0 3 1
Hornet Sportabout 17.02 0 0 3 2
Valiant 20.22 1 0 3 1
我們可以看到wt
和Carburator
列已經切換。
當引用名稱列表與數據框列的順序不同時,如何使用rename_if
重命名列?
編輯當引用列表包含特定數據框列中不存在的名稱時,使用rename_at(lst$Old, ~lst$New)
不起作用。
例如:
lst <- list(Old=c("mpg", "cyl", "disp", "carb", "wt", "gear", "xtra"), New=c("Miles per Gallon", "Cylinder", "Displacement", "Carburator", "Weight", "Gear", "ExtraCol"))
(參見xtra
和ExtraCol
名稱)
嘗試使用rename_at
而不是rename_if
,因為您有要替換的列的名稱。
library(dplyr)
head(mtcars) %>% rename_at(lst$Old, ~lst$New)
但是, _at
/ _if
/ _all
變體已被取代,因此請嘗試使用rename_with
。
head(mtcars) %>% rename_with(~lst$New, lst$Old)
# Miles per Gallon Cylinder Displacement hp drat Weight qsec vs am Gear Carburator
#Mazda RX4 21.0 6 160 110 3.90 2.620 16.46 0 1 4 4
#Mazda RX4 Wag 21.0 6 160 110 3.90 2.875 17.02 0 1 4 4
#Datsun 710 22.8 4 108 93 3.85 2.320 18.61 1 1 4 1
#Hornet 4 Drive 21.4 6 258 110 3.08 3.215 19.44 1 0 3 1
#Hornet Sportabout 18.7 8 360 175 3.15 3.440 17.02 0 0 3 2
#Valiant 18.1 6 225 105 2.76 3.460 20.22 1 0 3 1
在 base R 中,我們可以使用match
來做到這一點:
names(mtcars)[match(lst$Old, names(mtcars))] <- lst$New
如果lst
中有名稱中不存在的值,我們可以先過濾它們,然后使用上述方法。
inds <- lst$Old %in% names(mtcars)
lst <- lapply(lst, `[`, inds)
用match()
替換which()
按出現順序保留索引並解決問題
mtcars %>% rename_if(names(.) %in% lst$Old, function(x){lst$New[match(x, lst$Old)]})
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.