表1$subject包含变量“生物学”、“化学”和“物理”。对于表2,我想对此进行重新编码,将所有生物学/化学实例替换为1,将所有物理实例替换为0。
我尝试了以下代码,因为我相信这是可以使用recode和case_when命令实现的:
Table2 <- recode(Table1, case_when(
.$subject <= "biology" ~ 1,
.$subject <= "chemistry" ~ 1,
.$subject <= "physics" ~ 0))目前,我收到一条错误消息,提示"case_when必须是一个双边公式,而不是一个逻辑公式“。我是R的新手,所以我不太确定我做错了什么。真的很感谢任何人有任何想法!
发布于 2017-11-15 00:55:55
recode和case_when都是在矢量上运行,而不是在数据帧上运行。因此,要创建新的数据框,首先需要调用mutate,然后在mutate中使用recode或case_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发布于 2017-11-15 05:16:37
这也让我想起了我第一次开始使用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_codedf_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
https://stackoverflow.com/questions/47291039
复制相似问题