首页 > 解决方案 > 将管道用于多个 ifelse 函数的问题

问题描述

我正在使用 tidyverse 包并使用管道术语“%>%”,但是在多个函数上使用它之后,我似乎得到了一个错误(找不到函数)-.-^ 我没有找到任何关于这个的信息在网络中的术语(“%>%<-”)。

 #AB1 
  df_1$AB1<- ifelse(df_1$AB1==1 , 1 ,  
                        ifelse(df_1$AB1== 2, as.integer(-1),
                               ifelse(df_1$AB1== 3, 0,
                                      ifelse(df_1$AB1== 4,0,NA)))) %>%  
#AB2
  df_1$AB2<- ifelse(df_1$AB2==1 , 1 ,  
                     ifelse(df_1$AB2== 2, as.integer(-1),
                            ifelse(df_1$AB2== 3, 0,
                                   ifelse(df_1$AB2== 4,0,NA)))) 

我已尝试将数据框更改为 df_2 fe 或删除第二个df_1$AB2<-

#AB1 
  df_1$AB1<- ifelse(df_1$AB1==1 , 1 ,  
                        ifelse(df_1$AB1== 2, as.integer(-1),
                               ifelse(df_1$AB1== 3, 0,
                                      ifelse(df_1$AB1== 4,0,NA)))) %>%  
#AB2
  ifelse(df_1$AB2==1 , 1 ,  
                     ifelse(df_1$AB2== 2, as.integer(-1),
                            ifelse(df_1$AB2== 3, 0,
                                   ifelse(df_1$AB2== 4,0,NA))))

好像我真的没有得到管道的东西。我想让 R 一个接一个地运行这两个功能,但它似乎不起作用?有没有办法节省一些时间,因为每次我想以这种方式更改我的数据时,我想避免在许多不同的功能上使用“ctrl”+“r”。

最好的问候和 ty 看这个!

标签: rpipetidyverse

解决方案


您应该首先将整个数据框确定为管道的数据。之后,您不应该为每个函数提供数据输入,管道会这样做,这就是管道的魔力。

比你可以使用 transmute 来转换你想要的列。case_when() 是多个嵌套 ifelse() 的一个不错的、更简洁的替代方案。

如果没有来自您的数据的示例(请发布 (dput(head(df_1)))以及您的尝试结果,很难准确判断应该做什么,但您可能会对此感到满意:试试这个。


 #AB1 
  df_1 %>% transmute(AB1=case_when(
                        AB1==1 ~ 1 ,  
                        AB1== 2 ~ as.integer(-1),
                        AB1== 3 ~ 0,
                        AB1== 4 ~ 0,
                        TRUE ~ NA) %>%

         transmute(AB2=case_when(
                        AB2==2 ~ 1 ,  
                        AB2== 2 ~ as.integer(-1),
                        AB2== 3 ~ 0,
                        AB2== 4 ~ 0,
                        TRUE ~ NA)


推荐阅读