2016-12-25 76 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") 
相關問題