在某些情况下,是否有一种在dplyr中使用重命名功能的聪明方法是不存在要重命名的列?
例如,我希望以下内容不会导致错误
mtcars%>%rename(miles_per_gallon=mpg,missing_varible=foo)
Run Code Online (Sandbox Code Playgroud)
(结果如下:错误:未知变量:foo.)
而是完成所有可能重命名的数据框.
目前,我在重命名之前明确检查特定列是否存在
谢谢
伊恩
wib*_*ley 11
该plyr包有一个rename()带warn_missing参数的函数。
plyr::rename(
mtcars,
replace = c(mpg="miles_per_gallon", foo="missing_varible"),
warn_missing = FALSE
)
Run Code Online (Sandbox Code Playgroud)
如果使用它,请考虑使用requireNamespace() 而不是 library(),这样它的函数名称就不会与 dplyr 的名称冲突。
小智 9
也许不是设计者的意图,但是您可以利用带范围的动词rename_all和dplyr函数recode,该函数采用一个或多个键值对,例如old_name = "New Name"。
library(dplyr)
rename_all(iris, recode, Sepal.Length = "sepal_length", cyl = "cylinder")
# sepal_length Sepal.Width Petal.Length Petal.Width Species
# 1 5.1 3.5 1.4 0.2 setosa
# 2 4.9 3.0 1.4 0.2 setosa
# 3 4.7 3.2 1.3 0.2 setosa
# 4 4.6 3.1 1.5 0.2 setosa
# 5 5.0 3.6 1.4 0.2 setosa
# 6 5.4 3.9 1.7 0.4 setosa
# 7 4.6 3.4 1.4 0.3 setosa
# 8 5.0 3.4 1.5 0.2 setosa
# 9 4.4 2.9 1.4 0.2 setosa
Run Code Online (Sandbox Code Playgroud)
为了扩展泰勒船长提到的rename_with,如果你(可能)有多个变量需要重命名,我发现这个解决方案使用case_when效果很好并且易于阅读:
iris %>%
rename_with(
~ case_when(
. == "Petal.Width" ~ "NewPetalWidthName",
. == "NotActuallyThere" ~ "DoNothing",
TRUE ~ .
)
) %>%
head()
Run Code Online (Sandbox Code Playgroud)
有时可以不做任何事情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
Run Code Online (Sandbox Code Playgroud)
获得密钥后,只需执行一次易于理解的代码,即可进行重命名.
您可以使用它rename_at()来完成此操作:
mtcars %>%
rename_at(vars(matches("^missing_var$")), function(x) "foo")
Run Code Online (Sandbox Code Playgroud)
如果“missing_var”不在您的 data.frame 中,则不会返回错误。如果要替换可能存在或不存在的多个变量,可以将原始名称和新名称放在命名向量/列表中,编写一个简短的小函数来返回新变量名称。
customRename <- function(orig_name) {
renames <- c(
foo = "OOF",
bar = "RAB",
fi = "IF")
renames[[orig_name]]
}
mtcar %>%
rename_at(vars(matches("^foo$|^bar$|^fi$")), customRename)
Run Code Online (Sandbox Code Playgroud)