一起使用recode和case_when

时间:2017-11-14 16:45:38

标签: r dplyr

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的新手,所以我不太确定我做错了什么。真的很感激,如果有人有任何想法!

2 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分: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包非常有用(她是团队成员tidyverse)真的helpful vignette for it can be found here