仅当字段存在时才重命名,否则忽略

Dou*_*Fir 10 r dplyr

可以重命名字段:

mtcars %>% rename(bla = mpg)
Run Code Online (Sandbox Code Playgroud)

但如果该字段不存在,则会出现错误:

    mtcars %>% rename(MPG = mpg, CYL = cyl, bla = uyhgfrtgf)
Error: Can't rename columns that don't exist.
x Column `uyhgfrtgf` doesn't exist
Run Code Online (Sandbox Code Playgroud)

我看了看,?rename_if它说这现在被rename_with().

尝试重命名字段但有可能它们不存在的“正确”方法是什么(例如,在这种情况下是带有过滤器选择器的 ShinyApp)。

Tar*_*Jae 8

我们可以使用rename_withfrom dplyrpackage 并将其包装在一个~case_when函数中:

library(dplyr)

mtcars %>% 
    rename_with(
        ~ case_when(
        . == "mpg" ~ "MPG",
        . == "cyl" ~ "CYL",
        . == "bla" ~ "uyhgfrtgf",
        TRUE ~ .))
Run Code Online (Sandbox Code Playgroud)

                     MPG CYL  disp  hp drat    wt  qsec vs am gear carb
Mazda RX4           21.0   6 160.0 110 3.90 2.620 16.46  0  1    4    4
Mazda RX4 Wag       21.0   6 160.0 110 3.90 2.875 17.02  0  1    4    4
Datsun 710          22.8   4 108.0  93 3.85 2.320 18.61  1  1    4    1
Hornet 4 Drive      21.4   6 258.0 110 3.08 3.215 19.44  1  0    3    1
Hornet Sportabout   18.7   8 360.0 175 3.15 3.440 17.02  0  0    3    2
Run Code Online (Sandbox Code Playgroud)


H 1*_*H 1 8

使用any_of()了名为向量。 any_of()如果未找到变量,则不会出错。

lookup <-c("MPG" = "mpg", "CYL" = "cyl", "bla" = "uyhgfrtgf")

mtcars %>%
   rename(any_of(lookup))

                   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
...
Run Code Online (Sandbox Code Playgroud)


Mar*_*Gal 7

我很确定你可以用 NSE 做到这一点,但我不能处理这个(还?)。

所以你可以先定义一个查找变量:

lookup <- c("mpg" = "MPG", "cyl" = "CYL", "uyhgfrtgf" = "bla")
Run Code Online (Sandbox Code Playgroud)

注意:与您的rename功能相反。

现在你可以使用

library(dplyr)

df %>% 
  rename_with(.fn = ~lookup[.x], .cols = intersect(names(.), names(lookup)))
Run Code Online (Sandbox Code Playgroud)

返回

                     MPG CYL  disp  hp drat    wt  qsec vs am gear carb
Mazda RX4           21.0   6 160.0 110 3.90 2.620 16.46  0  1    4    4
Mazda RX4 Wag       21.0   6 160.0 110 3.90 2.875 17.02  0  1    4    4
Datsun 710          22.8   4 108.0  93 3.85 2.320 18.61  1  1    4    1
Hornet 4 Drive      21.4   6 258.0 110 3.08 3.215 19.44  1  0    3    1
Hornet Sportabout   18.7   8 360.0 175 3.15 3.440 17.02  0  0    3    2
Valiant             18.1   6 225.0 105 2.76 3.460 20.22  1  0    3    1
Duster 360          14.3   8 360.0 245 3.21 3.570 15.84  0  0    3    4
Merc 240D           24.4   4 146.7  62 3.69 3.190 20.00  1  0    4    2
Run Code Online (Sandbox Code Playgroud)

  • 谢谢你,什么是“NSE”?评价不规范? (2认同)

akr*_*run 6

我们可能会使用

library(dplyr)
lookup <-c("MPG" = "mpg", "CYL" = "cyl", "bla" = "uyhgfrtgf")
mtcars %>% 
    rename(!!! lookup[names(.) %in% lookup])
                     MPG CYL  disp  hp drat    wt  qsec vs am gear carb
Mazda RX4           21.0   6 160.0 110 3.90 2.620 16.46  0  1    4    4
Mazda RX4 Wag       21.0   6 160.0 110 3.90 2.875 17.02  0  1    4    4
Datsun 710          22.8   4 108.0  93 3.85 2.320 18.61  1  1    4    1
Hornet 4 Drive      21.4   6 258.0 110 3.08 3.215 19.44  1  0    3    1
Hornet Sportabout   18.7   8 360.0 175 3.15 3.440 17.02  0  0    3    2
Valiant             18.1   6 225.0 105 2.76 3.460 20.22  1  0    3    1
Duster 360          14.3   8 360.0 245 3.21 3.570 15.84  0  0    3    4
Merc 240D           24.4   4 146.7  62 3.69 3.190 20.00  1  0    4    2
Merc 230            22.8   4 140.8  95 3.92 3.150 22.90  1  0    4    2
Merc 280            19.2   6 167.6 123 3.92 3.440 18.30  1  0    4    4
...
Run Code Online (Sandbox Code Playgroud)