【问题标题】:Using recode and case_when together一起使用 recode 和 case_when
【发布时间】:2017-11-14 16:45:37
【问题描述】:

Table1$subject 包含变量“Biology”、“Chemistry”和“Physics”。 对于表 2,我想重新编码,用 1 替换所有生物/化学实例,用 0 替换所有物理实例。

我尝试了以下代码,因为我相信使用 recode 和 case_when 命令可以实现:

    Table2 <- recode(Table1, case_when(
    .$subject <= "biology" ~ 1,
    .$subject <= "chemistry" ~ 1,
    .$subject <= "physics" ~ 0))

目前,我收到一条错误消息,提示“case_when 必须是双边公式,而不是逻辑公式”。我是 R 新手,所以我不太确定自己做错了什么。如果有人有任何想法,真的很感激!

【问题讨论】:

    标签: r dplyr


    【解决方案1】:

    recodecase_when 都对向量进行操作,而不是数据帧。因此,要创建一个新数据框,您需要首先调用mutate,然后在mutate 中使用recodecase_when 创建一个新列(或覆盖现有列)。

    (此外,从最新的 dplyr 版本开始,您在使用 case_when 时不再需要使用 .$


    library(tibble)
    library(dplyr)
    
    df <- tribble(
      ~subject,
      "chemistry",
      "biology",
      "physics"
    )
    
    df %>% 
      mutate(subject2 = case_when(
        subject == "chemistry" ~ 1,
        subject == "biology" ~ 1,
        subject == "physics" ~ 2,
      ))
    
    #> # A tibble: 3 x 2
    #>     subject subject2
    #>       <chr>    <dbl>
    #> 1 chemistry        1
    #> 2   biology        1
    #> 3   physics        2
    
    df %>% 
      mutate(subject2 = recode(
        subject, 
        "chemistry" = 1,
        "biology" = 1,
        "physics" = 2,
      ))
    
    #> # A tibble: 3 x 2
    #>     subject subject2
    #>       <chr>    <dbl>
    #> 1 chemistry        1
    #> 2   biology        1
    #> 3   physics        2
    

    【讨论】:

      【解决方案2】:

      这也让我想起了我刚开始使用 R 的时候,我走过去问数据科学家同样的问题。

      他们与我分享了在这些情况下通常更可取的不同方法。我已经回顾了很多次,并且很高兴能早点学习它。

      数据库规范化方法(除非有人可以为我们提供更好的名称)涉及将您的代码值映射到单独的数据帧中。然后,您将映射值的集合和join 它们带到您要编码的数据帧中。

      这有助于让代码更严格地负责操作,而数据帧负责保存值/数据。这不仅可以加快您的大部分工作,使您免于在硬编码的查找表中手动编码,而且从长远来看,当有人在调试或执行修改和重新开发时,它会变得更加容易。

      标准化的数据管理方法如下所示:

      # your code mapping
      df_map <- tribble(~subject,    ~subj_cd,
                        "chemistry", 1,
                        "biology",   1,
                        "physics",   0)
      
      # a dummy raw dataframe that you might be wanting to encode
      df_raw <- tibble(stud_id = 2678:2877,
                       subject = sample(c("chemistry",
                                          "biology",
                                          "physics",
                                          "astronomy"), 200, replace = TRUE))
      
      # encoding the data
      df_coded <- 
          df_raw %>% 
          left_join(df_map)
      df_code
      
      > df_coded
      # A tibble: 200 x 3
         stud_id   subject subj_cd
           <int>     <chr>   <dbl>
       1    2678   physics       2
       2    2679   physics       2
       3    2680   biology       1
       4    2681 astronomy      NA
       5    2682 chemistry       1
       6    2683 chemistry       1
       7    2684   physics       2
       8    2685 chemistry       1
       9    2686 chemistry       1
      10    2687 astronomy      NA
      # ... with 190 more rows
      

      如果您发现自己需要一种快速简便的方法来构建更长的代码图(或者,尤其是与其他人分享它们),那么您可能会发现 Jenny Brian 的 googlesheets 包非常有用(她是团队成员 @ 987654326@) 真的helpful vignette for it can be found here

      【讨论】:

        猜你喜欢
        • 2019-01-08
        • 2021-11-09
        • 2022-11-30
        • 2021-01-19
        • 1970-01-01
        • 2019-05-26
        • 1970-01-01
        • 1970-01-01
        • 2018-03-22
        相关资源
        最近更新 更多