在某些情况下,重命名的列不存在时,是否有一种在dplyr中使用重命名功能的聪明方法?
例如,我希望以下内容不会导致错误
mtcars%>%rename(miles_per_gallon=mpg,missing_varible=foo)
(结果如下:错误:未知变量:foo。)
而是完成所有可能重命名的数据框。
目前,我在重命名
之前明确检查特定列是否存在由于
伊恩
答案 0 :(得分:6)
有时可以不在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
获得密钥后,只需一行易于理解的代码即可进行重命名。
答案 1 :(得分:4)
plyr
包具有rename()
函数且warn_missing
参数。
plyr::rename(
mtcars,
replace = c(mpg="miles_per_gallon", foo="missing_varible"),
warn_missing = FALSE
)
如果您使用它,请考虑使用requireNamespace()
instead of library()
,因此其功能名称不会与dplyr发生冲突。
答案 2 :(得分:3)
也许不是设计者的意图,但是您可以使用范围动词rename_all
和dplyr
函数recode
,该函数采用一个或多个键值对,例如{{1} }。
old_name = "New Name"
答案 3 :(得分:2)
他们现在提到了使用 rename_with
mtcars %>% rename_with( ~"missing_varible", "foo")
请查看帮助以获取更多详细信息。
答案 4 :(得分:1)
又一个解决方案,可以使用条件评估{}在dplyr中安全运行而不会引发错误。如果存在“ foo”,则将应用重命名,但是在缺少名为“ foo”的列的情况下继续使用原始df执行。
mtcars %>%
{if("foo" %in% names(.)) rename(., missing_varible=foo) else .} %>%
rename(miles_per_gallon=mpg)
答案 5 :(得分:1)
为了扩展 Tyler 船长提到的 rename_with
,如果您(可能)有多个变量需要重命名,我发现使用 case_when
的这个解决方案效果很好并且易于阅读:
iris %>%
rename_with(
~ case_when(
. == "Petal.Width" ~ "NewPetalWidthName",
. == "NotActuallyThere" ~ "DoNothing",
TRUE ~ .
)
) %>%
head()
答案 6 :(得分:0)
首先,在数据框df中使用您要重命名的列名定义一个列表。
columnNamesToRename <-
list(
newColumnName1 = "oldColumnName1",
newColumnName2 = "oldColumnName2"
)
下一步,删除列表中的元素,这些元素以列名作为名称,但不是数据框的列名:
columnNamesToRename.WhichAreColumnNamesInTibble <-
columnNamesToRename[columnNamesToRename %in% intersect(
unlist(columnNamesToRename),
colnames(df)
)]
然后,您可以使用命名列表columnNamesToRename.WhichAreColumnNamesInTibble重命名列名称:
df.WithRenamedColumnNames <-
df %>% dplyr::rename(!!!columnNamesToRename.WhichAreColumnNamesInTibble)
答案 7 :(得分:0)
您可以使用rename_at()
完成此操作:
mtcars %>%
rename_at(vars(matches("^missing_var$")), function(x) "foo")
如果data.frame中没有“ missing_var”,则不返回错误。 如果要替换可能存在或不存在的多个变量,可以将原始名称和新名称放入命名的向量/列表中,编写一个简短的小函数以返回新变量名称。
customRename <- function(orig_name) {
renames <- c(
foo = "OOF",
bar = "RAB",
fi = "IF")
renames[[orig_name]]
}
mtcar %>%
rename_at(vars(matches("^foo$|^bar$|^fi$")), customRename)