【问题标题】:opposite of mutate_at in dplyr与 dplyr 中的 mutate_at 相对
【发布时间】:2019-07-07 19:22:19
【问题描述】:

我需要 dplyr 中 mutate_at 的反义词。我想选择变量列表中未指定的一组列。

df <- tibble(var_not_to_be_modified = sample(c("T","F"),10, replace = TRUE),
             var_to_be_modified     = sample(c(1,0)    ,10, replace = TRUE) )

df %>%
mutate_at(c("var_not_to_be_modified"), as.numeric)

结果是将 var_to_be_modified 更改为 dbl。

【问题讨论】:

  • mutate_at(vars(-var_not_to_be_modified), as.numeric)。你可以在vars() 做任何你可以在select 做的事情。

标签: r dplyr


【解决方案1】:

将@Axeman 的评论转化为社区 wiki 的答案:

library(dplyr)
df %>%
  mutate_at(., vars(-var_not_to_be_modified), as.numeric)
 # A tibble: 10 x 2
#   var_not_to_be_modified var_to_be_modified
#   <chr>                               <dbl>
# 1 F                                       1
# 2 F                                       1
# 3 F                                       1
# 4 F                                       1
# 5 F                                       1
# 6 T                                       0
# 7 T                                       1
# 8 F                                       1
# 9 F                                       0
#10 T                                       1

来自vars的帮助页面:

参数

... 要在 mutate/summarise 中包含/排除的变量。您可以使用与 select() 中相同的规范。如果缺少,则默认为所有非分组变量。

【讨论】:

    【解决方案2】:

    如果我们传递一个字符向量,请使用one_of,这是删除列的规范方法

    library(dplyr)
    df %>%
      mutate_at(vars(-one_of(c("var_not_to_be_modified"))), as.numeric)
    # A tibble: 10 x 2
    #   var_not_to_be_modified var_to_be_modified
    #   <chr>                               <dbl>
    # 1 F                                       1
    # 2 F                                       1
    # 3 T                                       1
    # 4 F                                       0
    # 5 T                                       0
    # 6 F                                       1
    # 7 T                                       1
    # 8 T                                       1
    # 9 F                                       0
    #10 T                                       1
    

    根据?select_helpers

    one_of():匹配字符向量中的变量名。


    如果我们传递一个不在数据中的列名,则行为会有所不同。在这里,它不会以错误告终

     df %>% 
         mutate_at(vars(-one_of("hello")), as.numeric)
    

    df %>%
        mutate_at(vars(-hello), as.numeric)
    

    is_character(x) 中的错误:找不到对象“你好”

    换句话说,如果 OP 希望整个管道最终出现错误,则第二个选项更好,如果它仍然有效,但出现警告,则可以使用本文中的选项

    【讨论】:

    • 为什么说one_of 是执行此操作的规范方法?在 vars 中使用裸列名称似乎更接近 dplyr 用户已经熟悉的内容以及您将在 mutate_at 中使用的内容
    猜你喜欢
    • 1970-01-01
    • 2019-09-24
    • 1970-01-01
    • 2018-01-19
    • 1970-01-01
    • 1970-01-01
    • 2018-09-20
    • 2019-12-14
    • 2019-12-12
    相关资源
    最近更新 更多