R:使用recode,mutate和case_when重新编码变量

时间:2018-07-31 18:33:54

标签: r dplyr case-when mutate recode

我想为数据集中由core.vars定义的以下变量重新编码以下值<4 = -1,4 = 0,> 4 = 1,并且仍将其余变量保留在数据框中。

temp.df <- as.tibble (mtcars)
other.vars <- c('hp', 'drat', 'wt')
core.vars <- c('mpg', 'cyl', 'disp')
temp.df <- rownames_to_column (temp.df, var ="cars_id")
temp.df <- temp.df %>% mutate_if (is.integer, as.numeric)

我尝试了多种方法来实现此目的。使用case_whenmutaterecode,但没有运气。 recode需要一个向量,所以我的想法是为每个感兴趣的变量使用case_whenmutate创建一个向量,然后重新编码值。但是他们失败了。

temp.df <- temp.df %>% 
           mutate_at(.vars %in% (core.vars)), '< 4' = "-1", '4' = "0", '> 4' = "1")
  

错误:“ temp.df <-temp.df%>%mutate_at(.vars%in%(core.vars))中的意外',

temp.df <- temp.df %>% 
           mutate_at(vars(one_of(core.vars)), '< 4' = "-1", '4' = "0", '> 4' = "1")
  

inherits(x,“ fun_list”)中的错误:参数“ .funs”丢失,没有默认值

 temp.df <- temp.df %>% 
            mutate (temp.df, case_when (vars(one_of(core.vars)), recode ('< 4' = "-1", '4' = "0", '> 4' = "1")))
  

mutate_impl(.data,点)中的错误:temp.df列是不支持的类data.frame

 temp.df <- temp.df %>% 
            case_when (vars(one_of(core.vars)), recode ('< 4' = "-1", '4' = "0", '> 4' = "1"))
  

recode.character(< 4 =“ -1”,4 =“ 0”,> 4 =“ 1”)中的错误:缺少参数“ .x”,其中没有默认值

temp.df <- temp.df %>% rowwise() %>% mutate_at(vars (core.vars),
                                            funs (case_when (
                                                recode(., '< 4' = -1, '0' = 0, '>4' = 1)
                                            ))) %>%
 ungroup()`
  

mutate_impl(.data,点)中的错误:评估错误:情况1(recode(mpg, <4 = -1, 0 = 0,> 4 = 1))必须是两个双面配方,不是双份。另外:警告消息:在recode.numeric(mpg,< 4 = -1,0 = 0,>4 = 1)中:强制引入的NAs

论坛上的先前问题包括如何对单个变量执行此操作,但是如上所述,我有100个变量和300个样本,因此不能逐行单独输入它们。

理想情况下,最好不要创建单独的数据框然后再进行联接,或者像mutate那样创建多个单独的变量。

我确定有一个for循环和/或ifelse方法,但是正在尝试使用tidyverse来实现目标。任何建议都会有所帮助。

1 个答案:

答案 0 :(得分:4)

temp.df %>%
  mutate_at(vars(one_of(core.vars)), 
            function(x) case_when(
              x < 4 ~ -1,
              x == 4 ~ 0,
              x > 4 ~ 1
            ))

输出

# A tibble: 32 x 12
   cars_id             mpg   cyl  disp    hp  drat    wt  qsec    vs    am  gear  carb
   <chr>             <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
 1 Mazda RX4             1     1     1   110  3.9   2.62  16.5     0     1     4     4
 2 Mazda RX4 Wag         1     1     1   110  3.9   2.88  17.0     0     1     4     4
 3 Datsun 710            1     0     1    93  3.85  2.32  18.6     1     1     4     1
 4 Hornet 4 Drive        1     1     1   110  3.08  3.22  19.4     1     0     3     1
 5 Hornet Sportabout     1     1     1   175  3.15  3.44  17.0     0     0     3     2
 6 Valiant               1     1     1   105  2.76  3.46  20.2     1     0     3     1
 7 Duster 360            1     1     1   245  3.21  3.57  15.8     0     0     3     4
 8 Merc 240D             1     0     1    62  3.69  3.19  20       1     0     4     2
 9 Merc 230              1     0     1    95  3.92  3.15  22.9     1     0     4     2
10 Merc 280              1     1     1   123  3.92  3.44  18.3     1     0     4     4