首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >同时使用recode和case_when

同时使用recode和case_when
EN

Stack Overflow用户
提问于 2017-11-15 00:45:38
回答 2查看 2.9K关注 0票数 4

表1$subject包含变量“生物学”、“化学”和“物理”。对于表2,我想对此进行重新编码,将所有生物学/化学实例替换为1,将所有物理实例替换为0。

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

代码语言:javascript
复制
    Table2 <- recode(Table1, case_when(
    .$subject <= "biology" ~ 1,
    .$subject <= "chemistry" ~ 1,
    .$subject <= "physics" ~ 0))

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

EN

回答 2

Stack Overflow用户

发布于 2017-11-15 00:55:55

recodecase_when都是在矢量上运行,而不是在数据帧上运行。因此,要创建新的数据框,首先需要调用mutate,然后在mutate中使用recodecase_when创建新列(或覆盖现有列)。

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

代码语言:javascript
复制
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
票数 5
EN

Stack Overflow用户

发布于 2017-11-15 05:16:37

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

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

数据库规范化方法(除非有人可以用一个更好的名字来帮助我们)涉及到将代码值映射到一个单独的数据帧中。然后获取映射值的集合,并将它们join到您想要编码的数据帧。

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

然后,规范化的数据管理方法将如下所示:

代码语言:javascript
复制
# 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 1 2678物理2 22679物理2 32680生物学1 42681天文学NA 5 2682化学1 62683化学1 72684物理2 8 2685化学1 92686化学1 10 2687天文学NA # ...多了190行

如果您发现自己需要一种快速而简单的方法来构建更长的代码映射(或者,特别是与其他人共享它们),那么您可能会发现Jenny Brian的googlesheets包非常有用(她是team tidyverse的成员)A really helpful vignette for it can be found here

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47291039

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档