在dplyr和列中使用重命名时避免错误不存在

Iai*_*ain 11 r dplyr

在某些情况下,是否有一种在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_alldplyr函数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)

  • 在当前的“dplyr”生命周期中,“rename_all”已被“rename_with”取代。 (3认同)

hed*_*ds1 8

为了扩展泰勒船长提到的rename_with,如果你(可能)有多个变量需要重命名,我发现这个解决方案使用case_when效果很好并且易于阅读:

iris %>%
    rename_with(
        ~ case_when(
            . == "Petal.Width" ~ "NewPetalWidthName",
            . == "NotActuallyThere" ~ "DoNothing",
            TRUE ~ .
        )
    ) %>%
    head()
Run Code Online (Sandbox Code Playgroud)


Sam*_*son 7

有时可以不做任何事情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)

获得密钥后,只需执行一次易于理解的代码,即可进行重命名.

  • 可能没问题,但是尝试将所有内容都保留在一个范式中仍然很好:) (4认同)
  • 这仅适用于所有列都在`namekey`向量中.如果缺少一个,则没有错误,但它也重命名为"NA".来自@wibeasley的`plyr`答案让你可以在不丢失未知列名的情况下完成:`plyr :: rename(mtcars1,replace = namekey,warn_missing = F)` (4认同)
  • @Maxim.K `dplyr` 是一个包含基础 R 的范式。这是一个基础 R 解决方案,所以从这个意义上说,它仍然处于单一范式中。这只是不依赖于`dplyr` 为游戏带来的任何附加解决方案。 (2认同)

Zia*_*ian 6

您可以使用它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)

  • 在 dplyr 的最新版本中,rename_at 已被 across 的使用所取代。`mtcars %&gt;% 重命名(across(matches("^missing_var$"), ~ { "foo"}))` (2认同)