2016-12-25 103 views
0

我有一个脚本可以创建一个列,以便我知道哪个规则应该应用于数据框中的每一行。具有可变参数数量的R函数ifelse

EndoSubset$FU_Group<-ifelse(EndoSubset$IMorNoIM=="No_IM","Rule1", 
          ifelse(EndoSubset$IMorNoIM=="IM","Rule2", 
          ifelse(EndoSubset$IMorNoIM=="AnotherIM","Rule3", 
          "NoRules"))) 

我想使之成为一个功能这一点,以便可以有任意数量的规则和列任意数量的条件,所以它可能是:

EndoSubset$FU_Group<-ifelse(EndoSubset$IMorNoIM=="No_IM","Rule1", 
           ifelse(EndoSubset$IMorNoIM=="IM","Rule2", 
           ifelse(EndoSubset$IMorNoIM=="AnotherIM","Rule3", 
           ifelse(EndoSubset$IMorNoIM=="SomeOtherIM","Rule4", 
           ifelse(EndoSubset$IMorNoIM=="LotsOfIM","Rule5", 
           "NoRules"))) 

我明白,我可以使用这个省略号但我不明白如何同时使用条件字符串(“No_IM”,IM,“AnotherIM”等)和规则字符串(“Rule1”,“Rule2”,“ Rule3“等)

+0

创建一个查找data.frame并使用合并。 – Roland

+0

@Roland。不确定这个问题的答案。我想创建它作为重用的函数,因此希望函数具有可变数量的参数。我该怎么做呢? –

+0

也许使用'factor'。即'get_group < - function(x){factor(x $ IMorNoIM,levels = unique(x $ IMorNoIM),labels = c(paste0('rule',seq(length(unique(x $ IMorNoIM)))))) }' – Sotos

回答

2

此答案基于另一个已删除的不完整答案。

您可以使用dplyr包中的case_when()来实现此目的。它需要任意数量的条件。既然你不给一个可重复的例子,我说明其工作原理与mtcars

library(dplyr) 
mtcars$cyl_group <- case_when(mtcars$cyl == 4 ~ "Rule1", 
           mtcars$cyl == 6 ~ "Rule2", 
           TRUE ~ "NoRules") 
mtcars[2:5, ] 
##     mpg cyl disp hp drat wt qsec vs am gear carb cyl_group 
## Mazda RX4 Wag  21.0 6 160 110 3.90 2.875 17.02 0 1 4 4  Rule2 
## Datsun 710  22.8 4 108 93 3.85 2.320 18.61 1 1 4 1  Rule1 
## Hornet 4 Drive 21.4 6 258 110 3.08 3.215 19.44 1 0 3 1  Rule2 
## Hornet Sportabout 18.7 8 360 175 3.15 3.440 17.02 0 0 3 2 NoRules 

正如你所看到的,你可以很容易地使用~值连接的条件。你可以这样解决你的两个例子(我不能检查这个,因为你不给你的数据):

EndoSubset$FU_Group <- case_when(EndoSubset$IMorNoIM == "No_IM" ~ "Rule1", 
           EndoSubset$IMorNoIM == "IM" ~ "Rule2", 
           EndoSubset$IMorNoIM == "AnotherIM" ~ "Rule3", 
           TRUE ~ "NoRules") 

EndoSubset$FU_Group <- case_when(EndoSubset$IMorNoIM == "No_IM" ~ "Rule1", 
           EndoSubset$IMorNoIM == "IM" ~ "Rule2", 
           EndoSubset$IMorNoIM == "AnotherIM" ~ "Rule3", 
           EndoSubset$IMorNoIM == "SomeOtherIM" ~ "Rule4", 
           EndoSubset$IMorNoIM == "LotsOfIM" ~ "Rule5", 
           TRUE ~ "NoRules") 
相关问题