【问题标题】:mutate variable if column name contains a string如果列名包含字符串,则改变变量
【发布时间】:2018-01-27 18:08:07
【问题描述】:

我的数据有几列包含字符串“trait”。我想使用 dplyr 以相同的方式改变这些列。

我的第一反应是按以下方式使用mutate_if

my_data %>% mutate_if(contains('trait'), funs(if_else(.=='True',T,F)) )

但我得到了错误

Error: Variable context not set

这个错误是什么意思?如何正确使用mutate_if函数?

这是我的数据示例(省略了其他一些列)。

tibble::tribble(
  ~X1_on_1_rush_trait, ~acrobatic_clearance_trait, ~argues_with_officials_trait, ~avoids_using_weaker_foot_trait, ~backs_into_player_trait, ~bicycle_kicks_trait, ~cautious_with_crosses_trait, ~chip_shot_trait, ~chipped_penalty_trait, ~comes_for_crosses_trait, ~corner_specialist_trait, ~diver_trait, ~dives_into_tackles_trait, ~diving_header_trait, ~driven_pass_trait, ~early_crosser_trait, ~fan.s_favourite_trait, ~fancy_flicks_trait, ~finesse_shot_trait, ~flair_trait, ~flair_passes_trait, ~gk_flat_kick_trait, ~gk_long_throw_trait, ~gk_up_for_corners_trait, ~giant_throw_in_trait, ~inflexible_trait, ~injury_free_trait, ~injury_prone_trait, ~leadership_trait, ~long_passer_trait, ~long_shot_taker_trait, ~long_throw_in_trait, ~one_club_player_trait, ~outside_foot_shot_trait, ~playmaker_trait, ~power_free_kick_trait, ~power_header_trait, ~puncher_trait, ~rushes_out_of_goal_trait, ~saves_with_feet_trait, ~second_wind_trait, ~selfish_trait, ~skilled_dribbling_trait, ~stutter_penalty_trait, ~swerve_pass_trait, ~takes_finesse_free_kicks_trait, ~target_forward_trait, ~team_player_trait, ~technical_dribbler_trait, ~tries_to_beat_defensive_line_trait,                ~name,
              "False",                    "False",                      "False",                         "False",                  "False",              "False",                      "False",          "False",                "False",                  "False",                  "False",      "False",                   "False",              "False",            "False",              "False",                "False",             "False",             "False",       "True",             "False",             "False",              "False",                  "False",               "False",           "False",            "False",             "False",           "False",            "False",                 "True",              "False",                "False",                  "False",          "False",                 "True",             "False",        "False",                   "False",                "False",            "False",        "False",                   "True",                "False",            "False",                         "False",               "False",            "False",                   "False",                             "False",  "Cristiano Ronaldo",
              "False",                    "False",                      "False",                         "False",                  "False",              "False",                      "False",           "True",                "False",                  "False",                  "False",      "False",                   "False",              "False",            "False",              "False",                "False",             "False",              "True",      "False",             "False",             "False",              "False",                  "False",               "False",           "False",            "False",             "False",           "False",            "False",                 "True",              "False",                 "True",                  "False",           "True",                "False",             "False",        "False",                   "False",                "False",            "False",        "False",                   "True",                "False",            "False",                         "False",               "False",            "False",                   "False",                             "False",           "L. Messi",
              "False",                    "False",                      "False",                         "False",                  "False",              "False",                      "False",          "False",                "False",                  "False",                  "False",       "True",                   "False",              "False",            "False",              "False",                "False",             "False",             "False",       "True",             "False",             "False",              "False",                  "False",               "False",           "False",            "False",             "False",           "False",            "False",                "False",              "False",                "False",                  "False",          "False",                "False",             "False",        "False",                   "False",                "False",            "False",        "False",                   "True",                "False",            "False",                          "True",               "False",            "False",                    "True",                             "False",             "Neymar",
              "False",                    "False",                      "False",                         "False",                  "False",              "False",                      "False",          "False",                "False",                  "False",                  "False",       "True",                   "False",              "False",            "False",              "False",                "False",             "False",             "False",      "False",             "False",             "False",              "False",                  "False",               "False",           "False",            "False",             "False",           "False",            "False",                "False",              "False",                "False",                  "False",          "False",                "False",             "False",        "False",                   "False",                "False",            "False",        "False",                  "False",                "False",            "False",                         "False",               "False",            "False",                    "True",                              "True",          "L. Suárez",
               "True",                    "False",                      "False",                         "False",                  "False",              "False",                      "False",          "False",                "False",                   "True",                  "False",      "False",                   "False",              "False",            "False",              "False",                "False",             "False",             "False",      "False",             "False",             "False",               "True",                  "False",               "False",           "False",            "False",             "False",           "False",            "False",                "False",              "False",                "False",                  "False",          "False",                "False",             "False",        "False",                    "True",                "False",            "False",        "False",                  "False",                "False",            "False",                         "False",               "False",            "False",                   "False",                             "False",           "M. Neuer",
              "False",                    "False",                      "False",                         "False",                  "False",              "False",                      "False",           "True",                "False",                  "False",                  "False",      "False",                   "False",              "False",            "False",              "False",                "False",             "False",              "True",      "False",             "False",             "False",              "False",                  "False",               "False",           "False",             "True",             "False",           "False",            "False",                "False",              "False",                "False",                  "False",          "False",                "False",             "False",        "False",                   "False",                "False",            "False",        "False",                  "False",                "False",            "False",                         "False",               "False",            "False",                   "False",                             "False",     "R. Lewandowski"
  )

【问题讨论】:

    标签: r dplyr


    【解决方案1】:

    您应该将 contains("trait") 变量过滤器包装到 vars() 调用中

    my_data %>% 
      mutate_at(vars(contains('trait')), funs(.=='True'))
    

    附:我建议你也放弃你的if_else() 电话,直接使用逻辑比较

    【讨论】:

    • 你能解释一下 varis() 在这里有什么帮助吗?直觉。
    • 为避免 funs() 在 dplyr 0.8.0 警告中被弃用,请使用波浪号 (~) a la: my_data %>% mutate_at(vars(contains('trait')), ~ 。 =='真')
    【解决方案2】:

    根据您的目标,这也可能是一种灵活的选择

    df %>% 
      gather(trait, true_or_false, -name) %>% 
      mutate(true_or_false = case_when(
        str_detect(trait, "argues|avoids") ~ "boo",
        TRUE ~ .$true_or_false
      ))
    

    【讨论】:

      猜你喜欢
      • 2021-12-29
      • 1970-01-01
      • 1970-01-01
      • 2010-12-12
      • 1970-01-01
      • 2022-11-27
      • 1970-01-01
      • 1970-01-01
      • 2013-08-22
      相关资源
      最近更新 更多