2016-12-25 29 views
0

データフレームの各行にどのルールを適用するかを知るために、列を作成するスクリプトがあります。ifelseの可変数の引数を持つR関数

私はそれができるように、任意の数の規則とカラムのための条件の数に制限はありませんように関数にこれをしたい
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"、 "ルール3」など)

+0

lookup data.frameを作成し、mergeを使用します。 – Roland

+0

@Roland。それが質問に答えるかどうかわからない私はそれを再利用のための関数として作成したいので、関数のパラメータの数を変えたいと思っています。これはどうすればいいですか? –

+0

はおそらく 'factor'を使用します。つまり、 'get_group < - function(x){factor(x $ IMorNoIM、levels = unique(x $ IMorNoIM)、labels = c(paste0( 'ルール'、seq(長さはユニーク(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 

あなたが見ることができるように、あなたは簡単に~を使用して値を条件に接続することができます。あなたの2つの例はおそらくこのように解決できます(あなたはデータを与えないので、これはチェックできません):

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") 
関連する問題