【问题标题】:How to refer to column inside gsub when using mutate_at(vars(contains(...))使用 mutate_at(vars(contains(...)) 时如何引用 gsub 中的列
【发布时间】:2020-12-24 04:04:56
【问题描述】:

我想从我知道列名包含特定字符串的列中删除所有空格

可重现的例子

library(dplyr)
df <- data.frame(x_first = c("How are you", "Hello", "Good bye"), x_second = c(1:3))

      x_first x_second
1 How are you        1
2       Hello        2
3    Good bye        3

df %>%
  mutate_at(vars(contains("first")), gsub(" ", "", vars(.))

但我不知道应该如何引用 gsub 中的列,现在我有 vars(.) 但这会出错。

我想得到

    x_first x_second
1 Howareyou        1
2     Hello        2
3   Goodbye        3

【问题讨论】:

  • 你可以做df %&gt;% mutate(across(contains("first"), ~ gsub(" ", "", .)))

标签: r dplyr


【解决方案1】:

dplyr 的最新版本更喜欢使用新的across() 函数而不是mutate_at。这就是它的样子

df %>%
  mutate(across(contains("first"), ~gsub(" ", "", .)))

您可以使用~ 创建一个匿名函数,其中. 将是该列中的数据。

但同样适用于mutate_at

df %>%
  mutate_at(vars(contains("first")), ~gsub(" ", "", .))

或者你可以使用更长的函数语法

df %>%
  mutate_at(vars(contains("first")), function(x) gsub(" ", "", x))

【讨论】:

    【解决方案2】:

    我们可以使用来自stringrstr_remove。使用正则表达式模式\\s+ 可能会更好 - 即一个或多个空格,这样如果有任何可能有不相等的空格宽度,它就会被删除

    library(dplyr)
    library(stringr)
    df %>%
          mutate(across(ends_with('first'), str_remove_all, "\\s+"))
    

    -输出

    #     x_first x_second
    #1 Howareyou        1
    #2     Hello        2
    #3   Goodbye        3
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-06-01
      • 1970-01-01
      • 2016-08-25
      • 1970-01-01
      • 2018-01-19
      相关资源
      最近更新 更多