2016-11-18 18 views
1

QCAパッケージの使用では、通常、データセットの列を2倍の値に置き換えるためにifelseを使用します。しかし、ファジーセットを扱うときは、ネストされたifelseを使用することは醜いことがわかります。ベクトルを扱う際にifelseを置き換えるcaseステートメント

代わりにcase文を使用する方法はありますか? switchは制御フローのためのものであり、ベクトルを処理しません。例えば

DDDfz $VIES <- ifelse (DDD $vies == "p", 1, 0) 

はOKですが、

DDDfz $TIPO <- switch (DDD $tipo, "PD", 0, "PL", 0.5, "MP", 1) 
    Error in switch(DDD$tipo, "PD", 0, "PL", 0.5, "MP", 1) : 
    EXPR deve ser um vetor de comprimento 1 

答えて

4

switchはベクトル化されておらず、ここでは使用することはできません。 Rはこのようなタスクのためにfactorデータクラスを提供します。

factor(c(0, 0.5, 1), levels = c(0, 0.5, 1), 
        labels = c("PD", "PL", "MP")) 
#[1] PD PL MP 
#Levels: PD PL MP 

最初の例ではifelseも必要ありません。あなたは単にas.integer(DDD$vies == "p")を行うことができます。

PS:$の前のスペースは、奇妙なコードスタイルです。

1
#data example 
TIPO = c("PD", "PL", "MP", "PL", "MP") 

# here we create dictionary 
dict = c("PD" = 0, "PL" = 0.5, "MP" = 1) 
# further we match dictionary with original values 
recoded_TIPO = dict[TIPO] 

# result 
recoded_TIPO 
0

この機能は、残念ながらその有用性にかなり制限されています。 The ‹dplyr› package has a nice pattern matching functionそれはより強力です。この特定のケースで

result = case_when(
    x == 'PD' ~ 0, 
    x == 'PL' ~ 0.5, 
    x == 'MP' ~ 1 
) 

、(因子またはベクターを使用して)他のソリューションは、より簡潔で、より効率的です。しかし、一般的にはcase_whenがより強力です。

関連する問題