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