R语言 当在mutates中使用列名时,我们能避免每次都重复列名吗

bf1o4zei  于 2023-10-13  发布在  其他
关注(0)|答案(3)|浏览(110)

我在同一列上使用了几个mutate。我们如何才能只使用一次mutate而不重复列名?

df <- data.frame(
  c1 = c("Élève", "Café", "Château", "Noël", "Crème")
)

df2 <- df %>% 
  mutate(c1 = trimws(c1)) %>%
  mutate(c1 = gsub("\\s+", " ", c1)) %>%
  mutate(c1 = gsub("\"", "", c1)) %>%
  mutate(c1 = iconv(toupper(c1), to = "ASCII//TRANSLIT"))
neekobn8

neekobn81#

将管道放置在mutate中,如下所示:

df3 <- df %>%
  mutate(c1 = c1 %>%
    trimws %>%
    gsub("\\s+", " ", .) %>%
    gsub("\"", "", .) %>%
    toupper %>%
    iconv(to = "ASCII//TRANSLIT"))

identical(df2, df3)
## [1] TRUE
ddhy6vgd

ddhy6vgd2#

你可以在mutate调用中使用管道!此外,即使不是这种情况,在mutate函数调用中创建的列也可以稍后在同一函数调用中使用。所以你可以在一个mutate调用中继续重新定义c1。
但无论如何,这就是我如何做到这一点(使用几乎所有的stringr函数):

library(stringr)

df2 <- df |>
  mutate(c1 = str_squish(c1) |>
              str_remove_all("\"") |>
              str_to_upper() |>
              iconv(to = "ASCII//TRANSLIT"))
tzdcorbm

tzdcorbm3#

这并不是说您需要另一种解决方案,但是将所有步骤合并合并到一个函数中来整理mutate调用可能会很方便。您可以使用purrr::compose轻松地合并组合一串函数,以便在每次需要时按给定顺序运行它们。
使用G. Grothendieck的优秀代码分割成匿名函数:

library(tidyverse)

df <- data.frame(
  c1 = c("Élève", "Café", "Château", "Noël", "Crème")
)

tidy_text <- compose(
  \(t) gsub("\\s+", " ", t),
  \(t) gsub("\"", "", t),
  toupper,
  \(t) iconv(t, to = "ASCII//TRANSLIT")
)

df %>% 
  mutate(c1 = tidy_text(c1))
#>        c1
#> 1   ELEVE
#> 2    CAFE
#> 3 CHATEAU
#> 4    NOEL
#> 5   CREME

或者使用Mark的tidyverse代码和purrr公式/函数语法:

tidy_text2 <- compose(
  str_squish,
  ~ str_remove_all(.x, "\""),
  str_to_upper,
  ~ iconv(.x, to = "ASCII//TRANSLIT")
)

df %>%
  mutate(c1 = tidy_text2(c1))
#>        c1
#> 1   ELEVE
#> 2    CAFE
#> 3 CHATEAU
#> 4    NOEL
#> 5   CREME

当然,如果你只使用一次,可能就没有必要了!只是一种方式有一些位比别人整洁!

相关问题