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