多个ifelse语句和dplyr管道,无法识别第二个对象

多个ifelse语句和dplyr管道,无法识别第二个对象,r,dplyr,R,Dplyr,我试图做的是:从一个数据帧中获取列,使用ifelse语句对它们重新编码,然后将它们移动到一个新的数据帧,同时使用dplyr和管道一次性完成 问题:这段代码对于只包含一列的应用程序运行良好,但一旦R在同一行代码中遇到多个列,我就会遇到问题。第二列无法识别,R抛出错误。我得到以下错误: mutate_impl(.data,dots)中出错: 计算错误:找不到对象“var2_orig” 你有没有想过为什么会这样?不使用ifelse语句也可能有一种更简单的方法。我对这方面的建议也持开放态度,但我仍然好奇

我试图做的是:从一个数据帧中获取列,使用ifelse语句对它们重新编码,然后将它们移动到一个新的数据帧,同时使用dplyr和管道一次性完成

问题:这段代码对于只包含一列的应用程序运行良好,但一旦R在同一行代码中遇到多个列,我就会遇到问题。第二列无法识别,R抛出错误。我得到以下错误:

mutate_impl(.data,dots)中出错: 计算错误:找不到对象“var2_orig”

你有没有想过为什么会这样?不使用ifelse语句也可能有一种更简单的方法。我对这方面的建议也持开放态度,但我仍然好奇如何使用ifelse实现这一点,以及为什么在多个专栏中出现错误。非常感谢

示例代码:

library(tidyverse)

# creating fake data set
df_orig <- data_frame(var1_orig = sample(1:3, 50, replace = T),
                  var2_orig = sample(-2:2, 50, replace = T))

# works for one var (recoding 3's as NA, 2's as 1, and 1's as 0):

df_new <- df_orig %>%
  as_tibble() %>%
  transmute(var1_new = ifelse(var1_orig == 3, NA, ifelse(var1_orig == 
  2, 1, ifelse(var1_orig == 1, 0, var1_orig))))

# and works the other var (recoding negatives as NA, 1's and 2's as 1, and 
leaving 0's as 0's):

df_new <- df_orig %>%
  as_tibble() %>%
  transmute(var2_new = ifelse(var2_orig < 0, NA, ifelse(var2_orig == 
  1 | var2_orig == 2, 1, 0)))

# but not together in same line of code (error: var2_orig not recognized):

df_new <- df_orig %>%
  as_tibble() %>%
  transmute(var1_new = ifelse(var1_orig == 3, NA, ifelse(var1_orig == 
  2, 1, ifelse(var1_orig == 1, 0, var1_orig)))) %>%
  transmute(var2_new = ifelse(var2_orig < 0, NA, ifelse(var2_orig == 
  1 | var2_orig == 2, 1, 0)))
库(tidyverse)
#创建假数据集

df_origTransmute将删除变量,从而产生错误。您可以使用
mutate
更新现有变量,然后
rename\u all
(如果需要)更改其名称

df_orig %>%
    as_tibble() %>%
    mutate(var1_orig = ifelse(var1_orig == 3, NA, ifelse(var1_orig == 2, 1,
                                                         ifelse(var1_orig == 1, 0, var1_orig))),
           var2_orig = ifelse(var2_orig < 0, NA, ifelse(var2_orig == 1 | var2_orig == 2, 1, 0))) %>%
    rename_all(funs(sub('_.*', '_new', .)))
df_orig%>%
as_tible()%>%
变异(var1_orig=ifelse)(var1_orig==3,NA,ifelse)(var1_orig==2,1,
如果else(var1_orig==1,0,var1_orig)),
var2_orig=ifelse(var2_orig<0,NA,ifelse(var2_orig==1;var2_orig==2,1,0))%>%
重命名_all(funs(sub(“.*”、“_new”、))

dplyr的动词
transmute
只保留您创建的变量,并删除原始变量,因此第二个
transmute
不再出现
var2\u orig

您可以在同一个
transmute
调用中创建两个变量,使用
mutate
,然后在不需要时删除原始变量

顺便说一下,
case\u when
在这里很有用:

df_orig %>% 
  transmute(var1_new = case_when(var1_orig == 3 ~ NA_integer_,
                              var1_orig == 2 ~ 1L,
                              TRUE ~ var1_orig),
            var2_new = case_when(var2_orig < 0 ~ NA_integer_,
                              var2_orig %in% 1:2 ~ 1L,
                              TRUE ~ 0L)
  )
#> # A tibble: 50 x 2
#>    var1_new var2_new
#>       <int>    <int>
#>  1        1        1
#>  2        1        1
#>  3        1        0
#>  4       NA       NA
#>  5       NA        0
#>  6        1       NA
#>  7        1        1
#>  8        1        1
#>  9        1        1
#> 10        1        1
#> # ... with 40 more rows
df_orig%>%
转换(var1_new=case_when(var1_orig==3~NA_integer),
var1_orig==2~1L,
真~var1_orig),
var2_new=当(var2_orig<0~NA_integer_u)时的情况,
变量%1:2~1L中的原始%2,
真值(0升)
)
#>#A tible:50 x 2
#>var1_新var2_新
#>           
#>  1        1        1
#>  2        1        1
#>  3        1        0
#>4娜娜
#>5钠0
#>61NA
#>  7        1        1
#>  8        1        1
#>  9        1        1
#> 10        1        1
#> # ... 还有40行

transmute
删除它不创建的变量。使用
mutate
。太好了,我一直在考虑使用case\u when函数,这样从长远来看可能会有用。